Is it more effective to teach low level languages before high level ones or vice versa?
Well, straight-forward: It depends:


If the low level language you are thinking about teaching has complex code paradigms and is very abstract, then teaching it first would not be a good idea. 
However, if your low level language is one that caused newer, high level language to be created, then teaching the low level language can aid the students in understanding some core concepts of the newer language. They might be able to spot those concepts in other languages, too (making a sentence like "oh, just like in &lt;insert low level name here&gt;!" quite common)


Personally, if I faced a low level language like the one described in 2, I would only teach a few things. The students needn't be "fluent" in the low level language, as it isn't widely used in the "career market". I am not quite sure how widely C is used, but I am pretty sure that it is used less than C# or java (and certainly less than python).

So in essence, knowing the main ideas of the low level languages can be useful, but it is less important and useful than knowing high level languages.

As for a foundation for building knowledge, it goes back to teaching the main ideas of low level languages (rather than teaching the entire language), and then teaching the high level languages.