Hallo, ich bin neu in dem Thema, hab aber vor 30 Jahren schon Assembler (8085) programmiert. Das Prinzip ist mir also schon klar, behaupte ich. Jetzt hab ich mir das MyAVR Board MK2 besorgt, funktioniert auch soweit mit den Beispiel-Progs. Nur meine eigenen Programme laufen nicht an. Sogar die Primitiv-Version, einfach nur LED an, läuft nicht. Irgendeinen prinzipiellen Fehler hab ich da noch drin, ich komm aber nicht dahinter. Ich hab mal ein PRog angehängt, wird mit AVRStudio übersetzt, und gebrannt. Das Board sagt aber dann keinen Pieps, so als ob die CPU gar nicht loslaufen würde. Flash-Rom hab ich ausgelesen, das Programm landet im Speicher. Die Board-HW ist ok, das von myAVR gelieferte Testprogramm liest auf PortD Schalter ein und steuert die LEDs über PortB, das funktioniert. Egal welche (kurzen) Codeschnipsel ich aus dem Netz ziehe, sie laufen nicht an. Ach ja, im AVR Studio läuft das jeweilige Programm fehlerlos. Nachdem ich in der SW nichts finde, hab ich dann mal rumgeklickt und die ersten beiden ATMegas gehimmelt. Mindestens einer davon steht auf ext.Quarz, den muß ich wieder zurückholen. Sobald ich einen Taktgenerator auftreibe :-) Morgen krieg ich eine neue Lieferung von Prozessoren, die will ich nicht gleich den ersten beiden hinterherjagen :-(( Wenn jemand Lust ha, kann er ja mal versuchen, mir unter die Arme zu greifen. Irgendeine prinzipielle Kleinigkeit fehlt noch .... Gruß Ralf
Hallo,
1 | cbi DDRD,2 ; Port D 2 und 3 input |
2 | cbi DDRD,3 |
3 | sbi DDRD,2 ; Port D 2 und 3 Pullup aktiv |
4 | sbi DDRD,3 |
5 | sbi DDRB,0 ; Port B 0 und 1 Ausgang |
6 | sbi DDRB,1 |
Um die Pullups zu aktivieren musst du anstatt sbi DDRD,2 , sbi Portd,2 schreiben. Oben schaltest du deine Eingänge sofort wieder als Ausgänge um. Grüsse
Hi Als erstes: Finger weg von der Tabulatortaste. >sbi DDRD,2 ; Port D 2 und 3 Pullup aktiv >sbi DDRD,3 Das muss sbi PortD,n heissen MfG Spess
An die Interupttabelle würde ich vorne noch ein ".org 0x0000" anhängen ldi r16,hi8(RAMEND) out SPH,r16 ldi R16,lo8(RAMEND) out SPL,r16 Kenne ich im AVRStudio nur mir "HIGH" und "LOW", aber das wirst du ja nicht von ungefähr haben? cbi DDRD,2 cbi DDRD,3 sbi DDRD,2 sbi DDRD,3 sbi DDRB,0 sbi DDRB,1 Das ist Käse, in zweierlei Hinsicht. Erstens ist es ziemlich unüblich jedes Bit einzeln zu setzen, zweitens frage ich mich, wie du auf die Idee kommst, dass mit DDR sowohl die Pinart als auch der Pullup gesetzt wird. Richtig: clr temp1 out DDRD, temp1 ldi temp1, (1<<PD2) | (1<<PD3) out PORTD, temp1 ldi temp1, (1<<PB0) | (1<<PB1) out DDRB, temp1 Deine Konstanten im Hauptprogramm sind Käse. Die Register des Mega sin acht Bit breit. Nicht vier. Mit den Ports verhält es sich genauso. Deswegen fehlen bei dir stets vier Bit.
ldi r16,0 sbic PIND,2 ; wenn Tast1 ori r16,0b0001 ; dann LED1 sbic PIND,3 ; dito mit 2. Taste ori r16,0b0010 sbr r16,0b0100 ; bit3 immer an out PORTB,r16 ; und raus damit rjmp mainloop Du hast doch die Pullups aktiviert... Ein Tastendruck an Taster1 zieht doch den PIN auf logisch-0. In dem Moment soll LED1 leuchten. Also musst du den Leuchtbefehl überspringen, wenn der Pin auf high ist "sbis" main: ldi temp1, 1<<PB2 sbis PIND, Taster1 sbr temp1, 1<<LED1 sbis PIND, Taster2 sbr temp1, 1<<LED2 out PORTB, temp1 rjmp main Was du mit den den "ori" wolltest, verstehe ich auch noch nicht ganz.
Daniel P. schrieb: > Was du mit den den "ori" wolltest, verstehe ich auch noch nicht ganz. Bits setzen ^^ @ Ralf: Deine Main müsste laufen. Die LEDs müssten angehen Jedoch ist deine Stackini auskommentiert, das funktioniert nur solange du keine Unterprogramme, Interrupts push und pop benutzt. probier mal:
1 | AVR-Assembler-Code |
2 | ldi r16,high(RAMEND) |
3 | out SPH,r16 |
4 | ldi R16,low(RAMEND) |
5 | out SPL,r16 |
Hallo, jetzt bin ich wieder etwas beruhigt. Hab viel gelernt dabei! 1. Hochmut kommt vor dem Fall Auch wenn man vor 30 Jahren mal 8085 programmiert hat, macht man Fehler. 2. manchmal ist es besser, mit kleinen Schritten anzufangen. 3. Das Board hier ist verdammt fix mit Hilfen Ich hab die neuen ATMegas bekommen, langsam angefangen (LED Dauer-AN), dann erst Umschalter dazuprogrammiert. Und dann auch noch die Portbehandlung korrekt gemacht (Pullups). Es funktioniert! Danke! Ralf
Nehme ich richtig an, dass Du mit gas (dem GNU Assembler) arbeitest? Ich vermute das wegen hi8 und lo8. Dann musst Du das Argument von I/O-Befehlen in _SFR_IO_ADDR() setzen, also statt
1 | sbi DDRB, 1 ; falsch für GNU_Toolchain |
muss es
1 | sbi _SFR_IO_ADDR(DDRB), 1 |
heißen. Du kannst auch stattdessen an den Beginn
1 | #define __SFR_OFFSET 0
|
setzen. Tust Du keines von Beidem, so setzt der GNU Assembler SRAM-Adressen statt der um 0x20 niedrigeren I/O-Adressen ein.
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.