Hallo liebe Profis, nun sitze ich seit Tagen an einem miniProjekt um Assembler zu lernen und genauer den Umgang mit Ein-/Ausgängen und dem ADC als Eingang. Anbei sende ich den (zusammengebastelten) Quellcode. Mein Problem: Entweder bekomme ich keine Werte vom ADC in den r16/r17 oder dieses wird nicht sinnvoll ausgewertet. Was passieren soll sollte klar sein: Die LEDs (Grün Gelb Rot) sollen je nach stellung des Poti (an Port(Pin C0) aufleuchten. Was tatsächlich passiert: Das System startet und sofort ist Grün an, nach 1Sek (die eingestellte wait-time) wechselt es auf Rot und bleibt dort. Umabhängig von Eingang C0. Ja, ich bin vollkommen neu in ASM und habe bisher alles in VB oder C geschrieben. Dort sind mir alle Vorgänge klar, jedoch ist in ASM alles mit Registern und Co Neuland für mich. Die Suche (google und hier) habe ich nun schon mehrfach genutzt und bin so auch zu meinem aktuellen SourceCode gekommen. Wenn jemand bereit ist mir genauer zu erklären was ich falsch mache, wäre ich sehr sehr dankbar. Bitte kommt mir nicht mit "Nutz die Suche" oder "Das findet man überall". Wer Links hat, einfach Posten und über seine maßlose Überlegenheit freuen ;) Besten Dank, DerKatze =)
:
Verschoben durch User
DerKatze schrieb: > Was passieren soll sollte klar sein: > Die LEDs (Grün Gelb Rot) sollen je nach stellung des Poti (an > Port(Pin C0) aufleuchten. Dann schmeiss doch mal alles Andere aus dem Code erst mal raus ... Gruß Jobst
DerKatze schrieb: > Entweder bekomme ich keine Werte vom ADC Ich sehe nicht, dass überhaupt irgendwo eine Messung gestartet würde.
DerKatze schrieb: > Ja, ich bin vollkommen neu in ASM und habe bisher alles in VB oder C > geschrieben. Dort sind mir alle Vorgänge klar, jedoch ist in ASM alles > mit Registern und Co Neuland für mich. Und warum willst Du dann unbedingt auf Assembler umsteigen? C auf nem AVR ist nicht soo unterschiedlich. Man hat kein OS und 1000 Tasks sondern nur eine Mainloop und man sollte nicht planlos mit Variablen um sich schmeißen, sondern überlegen, was man wirklich speichern muß. Und natürlich immer den kleinst möglichen Typ nehmen (uint8_t reicht oft). Und Du solltest Dir erstmal eine Debugausgabe machen, z.B. über RS-232 auf den PC. Nur mit ner LED ist sehr mühsam. In C sähe das so aus:
1 | #define STX_PORT PORTB
|
2 | #define STX_PIN 0
|
3 | #define BAUD 9600
|
4 | |
5 | void sputchar( uint8_t c ) |
6 | {
|
7 | c = ~c; |
8 | STX_PORT &= ~(1<<STX_BIT); // start bit |
9 | for( uint8_t i = 10; i; i-- ){ // 10 bits |
10 | _delay_us( 1e6 / BAUD ); // bit duration |
11 | if( c & 1 ) |
12 | STX_PORT &= ~(1<<STX_BIT); // data bit 0 |
13 | else
|
14 | STX_PORT |= 1<<STX_BIT; // data bit 1 or stop bit |
15 | c >>= 1; |
16 | }
|
17 | }
|
Dann kannst Du Dir erstmal den ADC-Wert als Zahl ausgeben lassen.
Hey xD xD... ich muss mich entschuldigen xD ich habe leider die völlig falsche Datei raufgeladen :((( hier ist die Richtie =) Trotzdem an alle 'Vielen Vielen Dank'!!!! Eure Katz'
Hi
Was soll '.include "AVR.H"? In Assembler benutzt man die m8def.inc. Und
auch die Expessions vom Assembler, wie high, low ... .
>ldi r16,128 ;Vorteiler = ganz wichtig
Aber falsch. Sieh dir im Datenblatt an, wie das in ADCSRA eingestellt
wird.
MfG Spess
Hi > ldi r16,0 ;hier kann auch direkt die 0 o.a. eingegeben werden > out ADMUX,r16 ;Kanal auswählen Und was ist an AREF? >;Sollten nur 8 Bit = 256 Schritte notwendig sein, dann wie folgt: > ror r17 ;xxxxxxxN c=N > ror r16 ;Nnnnnnnn c=n > ror r17 ;xxxxxxxx c=N > ror r16 ;NNnnnnnn c=n Kannst du dir sparen. Einfach ADLAR in ADMUX setzen und ADCH auslesen. MfG Spess
Hey =) Danke schonmal!!! Also .. ich habe jetzt die 'm8def.inc' aktiviert und nun bringt das Programm folgenden Fehler: Hinweis: Es wird die im Quelltext angegebene Sprache verwendet: Assembler Hinweis: Es wurde folgender Dialekt ermittelt: atmel Fehler: AVR Studio ist nicht installiert. Verwenden Sie den GNU-Assembler oder installieren Sie AVR Studio. die neue Datei habe ich (wieder als .txt da es nur als .s gespreichert wird / Sry dafür) angehängt und auch das DB des IC. (Andere wurden als .asm gespeichert; Versteh einer das Programm o,O) Leider habe ich wirklich NULL Ahnung wie das mit den Registern geht und wie man diesen ADC überhaupt in Gang bekommt. Wie schon gesagt, den Code habe ich zusammengebastelt und das aus vielen Quellen. Einfach (wie bei Google) Auf-Gut-Glück. Wenn mir das jmd näher erläutern kann, bin ich extrem glücklich =) Anbei: Eine super Sache, dieses Forum!!!
Hi >Verwenden Sie den GNU-Assembler oder installieren Sie AVR Studio. Ich war von letzterem ausgegangen. Wenn du einen anderen Assembler benutzt musst du natürlich die passenden Dateien verwenden. >Wie schon gesagt, den Code habe ich zusammengebastelt und das aus vielen >Quellen. Einfach (wie bei Google) Auf-Gut-Glück. Lass mal das Gurgeln. Als erstes lies das Datenblatt, lies das Datenblatt, lies das Datenblatt, ... . >Leider habe ich wirklich NULL Ahnung wie das mit den Registern geht und >wie man diesen ADC überhaupt in Gang bekommt. Dann lies dir das http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC mal durch. MfG Spess
sooo... nochmals besten Dank.. vor allem an Spess =) Ich habe mir deinen Link mal durchgelesen und das mit Verstand, danach war es soooo einfach xD .. 2min geschrieben schon lief alles perfekt =) Anbei sende ich noch einmal den Code. Geschrieben in myAVR Workpad plus DEMO (eine Software mit extremen Fehlern). Ich habe auch Atmel Studio inzwischen, blicke da aber garnichts =( Also dann, GUTE NACHT Eure Katz'
Hi >Ich habe auch Atmel Studio inzwischen, blicke da aber garnichts =( Für Assemblerprogrammierung ist das Atmel Studio unnötig. Da reicht das AVR Studio 4.19 vollkommen. >Anbei sende ich noch einmal den Code. > ldi r16,0b01100000 ;int. Ref 8-Bit only Kanal C0 Mit [avrasm] ldi r16,1<<REFS0|1<<ADLAR [avrasm] weiß man gleich, was gemeint ist. >mainloop: wdr Hast du den Watchdog laufen? Wenn nicht ist das 'wdr' unnötig. > ;ADC Teil > sbi ADCSRA,ADSC ;AD Wandlung starten Im Free Running Mode muss der ADC einmal mit ADSC gestartet werden. Also das Ganze vor mainloop > nop > nop Wozu? Für eine Wandlung braucht der ADC bei deinem Prescaler 13*128 Controllertakte. Was sollen da die zwei nops? Um das Ende einer Wandlung festzustellen kann man ADIF in ADCSRA auswerten oder gleich den ADC Complete-Interrupt benutzen. > in r17,ADCL ;Low-Byte unbedingt zuerst > in r16,ADCH ;High-Byte mit Daten in r16 Bei gesetztem ADLAR reicht es ADCH auszulesen. > cpi r16,240 > brsh all ;r16 >= 240 Kannst du auch gleich durch den Code von 'all' ersetzen. MfG Spess
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.