Hi Ich entschuldige mich hier gleich einmal für diese "einfache" frage. Mein bruder ist leicht beim verzweifeln und ich weiss schon langsam auch nicht mehr weiter. ansich steckt nicht viel dahinter. wir wollen eigentlich nur ein LED mittels eines Atmega8 blinken lassen. Das Problem bei der ganzen geschichte ist nur, dass er einsteiger ist und dies sein erster versuch mit µC ist. Nun, die frage: hätte vl von euch jemand ein asm-file, c-file bzw basic-file, mit hilfreichen kommentaren, was ein LED blinken lässt und den internen quarz benutzt? bzw wie aktiviert man den internen quarz? ach und gleich im voraus... das tutorial kenne ich schon und habe es mir auch angesehen, aber nachdem mein bruder weiter entfernt lebt und ich ihm nur per e-mail helfen kann und ich das ganze nur theoretisch betreibe, wäre es mir eben lieber wenn jemand ein funkionsfähiges programm hätte. danke für eure hilfe mfg schoasch
Ich hab leider grad nur nen m32 auffem Steckbrett, aber der Code ist ja portabel. Interner Quarz ist standardmäßig eingeschaltet, wenn er nicht grad rumgespielt hat. dave
Der interne Takt ist kein Quarz, aber das ist im Prinzip erst mal egal. Aktivieren braucht man ihn nicht, er ist schon ab Werk eingestellt. Basic-Code ist anbei, muß aber natürlich noch für den entsprechnenden IO-port angepaßt werden. Habt Ihr die Checkliste schon angeschaut? http://www.mikrocontroller.net/articles/AVR_Checkliste
Ich danke euch recht herzlich. @dave wozu brauche ich folgende zeilen? .cseg ; codesegment fängt jetzt hier an .org 0 ; und zwar bei 0 PS.: was noch zu erwähnen ist...ich kann noch kein assambler sondern eher nur C ;-) was das ganze eben schwierig macht
Hallo .cseg sagt dem assembler das er das folgende in den flash screiben soll .org 0 sagt dem assembler ab welcher adresse - $0000
Hallo Schoaschi, hier hast du einen kommentierten Assembler-Code zum Thema Blinken und Int.Oszillator (Hab grad extra für dich geschrieben und laufen lassen).
ich danke euch schön langsam aber sicher wird mir assambler immer klarer. ein paar kleine fragen hätte ich noch. habe ich das richtig verstanden: mit "out PORTB, temp" schreibe ich die daten temp aufs port b ? sbis PORTB,0 --> kann ich das mit einer if abfrage in C vergleich? was bewirkt "reti"? und welche werte werden in das register OSCCAL geschrieben? 2 für 2Mhz? mfg
""mit "out PORTB, temp" schreibe ich die daten temp aufs port b ?"" ->korrekt. Die Daten des Arbeitsregisters "temp" werden am PortB ausgegeben. ""sbis PORTB,0 --> kann ich das mit einer if abfrage in C vergleich?"" -> "sbis" bedeutet Skip if this Bit in I/O-Register is Set und überspringt einfach den nachfolgenden Befehl, falls dieser Bit (hier Bit 0) in einem IO-Register (hier PORTB) gesetzt ist (oder wenn gelöscht im Falle des Befels "sbic"). Einen Analogon in C gibt es nicht. ""was bewirkt "reti"?"" -> "reti" bedeutet "RETurn from Interrupt routine". Es lässt die Interrupt-Abarbeitung beenden und wieder zu der Stelle im Programm springen, an der sich der Interrupt ereignet hatte. Ein gewöhnliches Unterprogramm wird mit einem "ret" verlassen ""welche werte werden in das register OSCCAL geschrieben? 2 für 2Mhz?"" ->OSCCAL ist nur für die Feineinstellung des internen Oszillators da. Die Eigentliche Frequenzeinstellung wird in der Bedienungsoberfläche des Programmer-Tools vorgenommen (Ich und wohl die meisten hier haben einen STK500-Board in Verbindung mit AVRStudio (freeware)). Und so macht man das: Du gehst unter AVRStudio oben in die "Tools", dann "STK500", dort auf "Advanced" und klickst auf "Calibrate for frequency", wo die Auswahl möglicher Frequenzen steht und eingestellt wird. Dann auf "Read Calib. Byte". Dieser Wert ist vom Werk aus im Controller gespeichert und wird nun ausgelesen und Dir gezeigt. Diese Zahl trägst Du dann IM PROGRAMM ins OSCCAL ein, wie ich es gemacht habe. Dann wird dein µC mit exakt der gewählten Frequenz laufen (z.B 4MHz). Nun folgt die Antwort auf deine nächste Frage :) "Warum erst umständlich auslesen, um gleich darauf wieder reinzuschreiben?!" Aus einem einfachen Grund, mein Freund: durch die Variation des OSCCAL-Wertes kannst du deine Frequenz fast beliebig einstellen! Je kleiner diese Zahl, umso langsamer wird dein interner Oszi und umgekehrt.
Die Erklärung zu "RETI" ist naja nicht ganz perfekt. In der ISR (Interrupt Service Routine (kein Plan über die Schreibung hehe)) wird beim Beginn erst mal das "I"-Flag gelöscht, damit standardmäßig keine weitere ISR eintreten kann. Wenn man es will, setzt man halt gleich wieder mit "SEI" (SEt I). RETI ist folglich genau das gleiche wie RETurn, nur dass zusätzlich noch das I-Flag gesetzt wird. Manchmal lösch ich bei einer Routine das I-Flag und spare damit gleich nen ganzen Takt (deswegen macht man ja Assembler ;) ) Ist ein kleiner Unterschied, aber so isses halt. ------- Noch nebenbei zu dem Source von Richard: Man muss aufpassen, wenn man mal auf einen AVR mit größerem Flash umsteigt, dass man unbedingt die IRQ Vektoren (die RETI/RJMP am Anfang des .cseg) umändert. Beim Mega8 liegen sie noch je 1 Word (RJMP/RETI = 1 Word), jedoch mit größerem Flash braucht man für die komplette Adressierung 2 Word, deswegen sind diese dann 2 Word entfernt. Am besten finde ich immernoch die Methode jeden IRQ den man benutz mit einem eigenen .org zu kennzeichnen, am besten statt einer absoluten Angabe eine aus der .include zu nehmen, z.b. T0OVFADDR (ich denke, die ist falsch, ich kann die nicht auswendig). ------ Viel Text, etwas mehr als 10 Zeilen, sorry. dave
>"...zusätzlich noch das I-Flag gesetzt wird."
-> Da hast du absolut Recht, Dave. Ich hab' vergessen, dieses wichtige
Detail zu erwähnen!
Ich danke euch für die antworten :-) mein bruder klagt noch immer herum... wobei dieser in sachen elektrotechnik etwas zu kompliziert denkt... ok das mit dem Calibrieren ist so eine sache ;-) denn ich habe das stk500 board nicht und er ebenfalls nicht. er benutzt einen programmer marke eigenbau ;-).. vl hats auch damit was zu tun das das ganze nicht läuft. achja... irgendwie sind mir bis jetzt die At89C52 und At89Cx051 am liebsten ;-) bei denen hats bis jetzt immer hingehaut. denn diese benutzen wir auch in da schule und besitzen eine ziemlich guten C Compiler (keil uVision).nur hat sich mein bruder eingebildet er muss es mit einem ATmega8 probieren, da es für diesen einen einfachen Programmer gibt, denn ein programmiergerät ist nicht so billig ;-) zb Galep 378€.... die spinnen ;-)
@Richard Also meine Erklärung war keines Falls so gemeint, dass deine schlecht ist ;) nur könnte ich mir vorstellen, dass er, wenn er sich dann richtig mit beschäftigt hat, sich denkt: Warum brauch ich für eine ISR nen andren Rücksprung als für ne Routine. (Und ich hatte Zeit und will die 10 Zeilen noch ausnutzen G) dave
"irgendwie sind mir bis jetzt die At89C52 und At89Cx051 am liebsten ..." "...er muss es mit einem ATmega8 probieren, da es für diesen einen einfachen Programmer gibt, denn ein programmiergerät ist nicht so billig ;-)" Der AT89C52 ist nicht mehr für Neuentwicklungen vorzusehen, sondern der AT89S52 (Reichelt: 1,60) und der ist wie die AVRs über SPI programmierbar. Daneben gibt es noch die AT89C51ED2 usw. die haben einen Bootloader, also direkt über die COM programmierbar, kosten aber etwas mehr. Einfach mal bei Atmel ins Web schauen, was es da alles für Typen gibt. Peter
"Manchmal lösch ich bei einer Routine das I-Flag und spare damit gleich nen ganzen Takt (deswegen macht man ja Assembler ;)" dem versteht ich nicht ein int wird auslöst und es folgt der sprung auf den vector und dann die isr. wann löschst du das i flag damit es einen unerschied macht? ob es der assembler durch reti/ret+sei macht sollte von der anzahl takte doch eigentlich keinen unterschied machen oder??
Nein, nicht in der ISR, sondern einfach während des Programmes, wenn ich z.B. nicht will, dass ich unterbrochen werde: routine: cli 1 nop 1 nop 1 reti 4 anstatt: routine cli 1 nop 1 nop 1 sei 1 ret 4 RET und RETI kosten beidesmal 4 Takte. Bei ISR ist eigentlich nur ein RETI logisch. Ich glaube, das war einfach zu kompliziert fürn Anfang... war einfach nur so gemeint, dass du später mal beim optimieren nen Takt sparen kannst ;) @Richard Ich wusste nicht, wie du das verstanden hast. Dass kam mir sarkastisch vor, aber nun gut ;) dave
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.