AVR - Ich verzweifle

C

Christian Sander

Guest
Liebe Newsgroup,

ich verzweifele bei meinen ersten Gehversuchen mit dem AVR. Ich möchte
einfach nur
den Ausgang PD5 bei jedem Programmdurchlauf invertieren. Leider läuft das
Programm
gar nicht. Ich habe das kurze Programm eingefügt. Sieht jemand den
Fehler???

Grüße aus München,

Christian


..INCLUDE "8515def.inc"

..def temp = r16

..equ LED = PA0
..equ WDOG = PD5

..dseg
..org 0x60

temp_wdog: .byte 1 ;

; Prgrammbeginn, Interrupt-Vektoren
; ---------------------------------
;
..cseg
.. org 0x0000
rjmp main ;Programmstart

main: rcall Init

main_loop: rcall Watchdog
cbi PORTA, LED
rjmp main_loop




Init: ldi temp, 0b00100000 ;alle Ausgänge auf Ausgang Schalten (PORTD)
out DDRD,temp

ldi temp, 0b00000001 ;alle Ausgänge auf Ausgang Schalten (PORTA)
out DDRA,temp


ret


Watchdog: lds R18,temp_wdog
bst R18,1 ;Bit 1 aus Register in T-Flag schreiben
brtc Watchdog_clr ;Springe wenn 0
ldi R18,0x00
sts temp_wdog,R18 ;wenn nicht 0 dann lade 0
sbi PORTD, WDOG ;Ausgang triggern
ret

Watchdog_clr: cbi PORTD, WDOG ;Ausgang triggern
ldi R18,0xFF
sts temp_wdog,R18 ;wenn nicht 0 dann lade 0
ret
 
Hallo Christian,

Christian Sander wrote:
Liebe Newsgroup,

ich verzweifele bei meinen ersten Gehversuchen mit dem AVR. Ich möchte
einfach nur
den Ausgang PD5 bei jedem Programmdurchlauf invertieren. Leider läuft
das Programm
gar nicht. Ich habe das kurze Programm eingefügt. Sieht jemand den
Fehler???
So, wie ich es hier auf die Schnelle sehe, hast Du den Stack nicht
initialisiert.
Das sollte gleich die allerste Anweiung nach dem Reset sein.
Sonst funktioniert kein rcall...

Gruß Rolf
 
Christian Sander wrote:

.INCLUDE "8515def.inc"
Ich spreche mal für meine Erfahrungen, welche sich aber "nur" um 2313 und
ATtiny15 drehen.


Allgemein ist zu sagen, dass ich bewusst in meinen ersten Gehversuchen auf
irgendwelche Watchdog-Geschichten verzichtet habe, da man dort schnell
Fehler machen kann. Am besten erstmal abschalten.


main_loop: rcall Watchdog
cbi PORTA, LED
rjmp main_loop
Diese Routine würde ich ein wenig anders gestalten:

main_loop:
in temp, pina ; Aktuelle Werte einlesen
com temp ; Werte invertieren
out porta, temp ; Werte ausgeben
rjmp main_loop

Wenn Du Dir sicher bist, dass r16 (alias temp) nicht in dieser Schleife
nicht noch anderweitig genutzt wird, kannst Du auch die Zeile "in temp,
pina" weglassen.

Zum Sinn der Routine:
- "in" liest mir die Werte des Ports A auf mein R16 (PINA könnte in diesem
einfachen Fall auch durch PORTA ersetzt werden, aber: die Daten für PORTA
kommen aus dem Speicher, die von PINA von der Peripherie)
- "com" invertiert alle Bits im Register (kann Probleme geben, da alle pins,
die nicht als "Ausgang" definiert werden, dann jeweils den Pull-Up
einschalten und ausschalten und einschalten und aus.....)
- "out" setzt die Ports wieder.

Versuchs mal und gib ein Feedback,
Viele Grüße,
Michael
 
Danke Rolf, das mit dem SP stimmte. Deshalb lief es gar nicht.

Die LED ist eine Anzeige, und hat mit dem Watchdog nichts zu tun.
Der befindet sich auf PD5. Ich dachte mit ich belege ein Register mit
00 und abwechselnd ff und Teste dann das T-Flag.

Zu Deiner Routine. Würde ich nicht mit out PORTA alle Pints des
PORTs ansprechen?

Gruß,

Christian




Christian Sander wrote:

.INCLUDE "8515def.inc"

Ich spreche mal für meine Erfahrungen, welche sich aber "nur" um 2313 und
ATtiny15 drehen.


Allgemein ist zu sagen, dass ich bewusst in meinen ersten Gehversuchen auf
irgendwelche Watchdog-Geschichten verzichtet habe, da man dort schnell
Fehler machen kann. Am besten erstmal abschalten.


main_loop: rcall Watchdog
cbi PORTA, LED
rjmp main_loop

Diese Routine würde ich ein wenig anders gestalten:

main_loop:
in temp, pina ; Aktuelle Werte einlesen
com temp ; Werte invertieren
out porta, temp ; Werte ausgeben
rjmp main_loop

Wenn Du Dir sicher bist, dass r16 (alias temp) nicht in dieser Schleife
nicht noch anderweitig genutzt wird, kannst Du auch die Zeile "in temp,
pina" weglassen.

Zum Sinn der Routine:
- "in" liest mir die Werte des Ports A auf mein R16 (PINA könnte in diesem
einfachen Fall auch durch PORTA ersetzt werden, aber: die Daten für PORTA
kommen aus dem Speicher, die von PINA von der Peripherie)
- "com" invertiert alle Bits im Register (kann Probleme geben, da alle
pins,
die nicht als "Ausgang" definiert werden, dann jeweils den Pull-Up
einschalten und ausschalten und einschalten und aus.....)
- "out" setzt die Ports wieder.

Versuchs mal und gib ein Feedback,
Viele Grüße,
Michael
 
Danke Rolf, das mit dem SP stimmte. Deshalb lief es gar nicht.
Tut mir leid, an diese Möglichkeit dachte ich garnicht...

Die LED ist eine Anzeige, und hat mit dem Watchdog nichts zu tun.
War nur ein Tipp meinerseits. Bei ersten Gehversuchen würde ich alles
weglassen, was nicht benötigt wird. Aber wenn es dennoch klappt: Herzlichen
Glückwunsch!

Zu Deiner Routine. Würde ich nicht mit out PORTA alle Pints des
PORTs ansprechen?
Ja würdest Du. Bei ersten Gehversuchen ist das sogar legitim... Es ging ja
nur darum, das ganze zum Laufen zu bringen, oder irre ich mich da? ich habe
das anfangs immer so gemacht und es hat wunderbar funktioniert.

Viele Grüße,
Michael
 
Hast ja recht. Bin ja dankbar für jeden Hinweis.

Bis hoffentlich zum nächsten Mal,

Christian

"Michael" <habe-keine@nirgendwo.de> schrieb im Newsbeitrag
news:cdqjlb$fjc$01$1@news.t-online.com...
Danke Rolf, das mit dem SP stimmte. Deshalb lief es gar nicht.

Tut mir leid, an diese Möglichkeit dachte ich garnicht...

Die LED ist eine Anzeige, und hat mit dem Watchdog nichts zu tun.

War nur ein Tipp meinerseits. Bei ersten Gehversuchen würde ich alles
weglassen, was nicht benötigt wird. Aber wenn es dennoch klappt:
Herzlichen
Glückwunsch!

Zu Deiner Routine. Würde ich nicht mit out PORTA alle Pints des
PORTs ansprechen?

Ja würdest Du. Bei ersten Gehversuchen ist das sogar legitim... Es ging ja
nur darum, das ganze zum Laufen zu bringen, oder irre ich mich da? ich
habe
das anfangs immer so gemacht und es hat wunderbar funktioniert.

Viele Grüße,
Michael
 
was häst du von der Variante das dein Programm funktioniert, du aber von dem
Ergebniss nichts siehst da du das blinken mit mehreren hundert KHZ einfach
nicht siehst. Also einfach mal eine Warteschleife in deine "main_loop"
Wenn du mit dem AVR Studio entwickelst kannst du dir die Register und die
Ports im Simulator ansehen.


Gruss
Jürgen


>
 

Welcome to EDABoard.com

Sponsor

Back
Top