WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Home Cockpit - Das Forum für die "Bastler" (http://www.wcm.at/forum/forumdisplay.php?f=55)
-   -   AVR-Controller Allgemein (http://www.wcm.at/forum/showthread.php?t=204356)

philharmony 25.11.2006 19:55

AVR-Controller Allgemein
 
So, bevor ich jedes mal nen neuen Thread aufmache, hier ein neuer für alle Fragen, Antworten und Tips was AVR-Controller, WinAVR, AVR-Studio etc angeht.

Meine erste Frage: Worin unterscheiden sich die Register 0-15 von 16-31?
Es ist in diversen Tutorials immer wieder die Rede das bestimmte Funktionen nur mit den Oberen 16 gehn, und das die unteren mit diversen Funktionen verknüpft sind (wie counter etc).
Folgt das einer verständlichen gesetzmässigkeit? Aus dem Manual geht das auch nicht wirklich hervor, vllt weiss da jmd mehr?

dirkan 26.11.2006 00:21

Hallo,

Nur wenn du in Assembler programmierst, wirst du den Unterschied kennen müssen. Es sind Funktionen zur indexierung, also immer wenn du Tabellen verarbeitest, die nur in den oberen gehen. Aber es gibt noch mehr Einschränkungen.
Alles steht aber perfekt im Handbuch von Atmel!


Gruss Dirk

philharmony 26.11.2006 01:54

Da ich absolut keine Ahnung von C habe, und mit Assembler soweit ganz gut klarkomme (soweit ich das nach ein paar einfachen Beispielen sagen kann) ist das ganz interessant für mich.
In demfall muss ich das Handbuch doch nochmal ausführlicher lesen.
Vielleicht hätte ich mir für den Anfang lieber nen nicht ganz so mächtigen und Umfangreichen Controller wie den Atmega8535 Kaufen sollen, der kann sooo viel dass ich gar nicht weiss wo ich angangen soll ;)
Ich denke für ne "einfache" Panelsteuerung (Diverse NAV/COM- sowie Overhead-Panels) is der sowieso etwas oversized oder?

philharmony 27.11.2006 17:18

Moin, habe hier ein kleines Problem beim Versuch, eine REdec-Funktion zu entwickeln.
Im Simulationsmodus der AVR-Studio funktionert es, auf dem Board leuchtet immer nur LED7, sie geht aus wenn SW0 ODER SW1 gedrückt sind.
Hier der Assemblercode:

Zitat:

.nolist
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m8535def.inc"
.list

.def vorrueck=r16
.def counter=r17
.def AR1=r18
.def AR2=r19
.def gezaehlt=r20
.def hilfszaehler=r21
rjmp main

main:

ldi AR1,LOW(RAMEND) ;Stackpointer
out SPL,AR1
ldi AR1,HIGH(RAMEND)
out SPH,AR1

ldi AR1, 0x00 ;DataDirection D für Input
out DDRD, AR1

ldi AR1, 0xFF ; Port D alles auf 1 Setzen (1=alles aus)
out PORTD, AR1

ldi AR1, 0xFF ; Datadirection B auf 0 also Eingang
out DDRB, AR1 ; Port B alles 1 damit alle LDS aus
out PORTB, AR1

ldi gezaehlt, 1
loop:
in AR2, PIND
rcall pruefen_reset
rcall ausgabe
rjmp loop






pruefen_reset:
ldi AR1, 0xFF
cpse AR1, AR2
rjmp pruefen_vor
rcall entprellen
ldi gezaehlt, 0
ret

pruefen_vor:
ldi AR1, 0xFE
cpse AR1, AR2
rjmp pruefen_rueck
rcall entprellen
ldi vorrueck, 1
rjmp pulse

pruefen_rueck:
ldi AR1, 0xFD
cpse AR1, AR2
rjmp pulse
rcall entprellen
ldi vorrueck, 2
rjmp pulse

pulse:
ldi AR1, 0xFC
cpse AR1, AR2
rjmp loop
rcall entprellen
ldi AR1, 0
cpse AR1, gezaehlt
rjmp loop
ldi gezaehlt, 1
ldi AR1, 0xFE
cpse AR1, vorrueck
rjmp decrease
rjmp increase

decrease:
dec counter
rjmp ausgabe

increase:
inc counter
rjmp ausgabe

ausgabe:
mov R1, counter
com R1
out PORTB, R1
rjmp loop

entprellen:
clr hilfszaehler
loop2:
in AR2, PIND
cpse AR1, AR2
rjmp loop
inc hilfszaehler
ldi AR2, 56
cpse hilfszaehler, AR2
rjmp loop2
ret



philharmony 28.11.2006 13:59

Ok, hat sich geklärt, ich hatte an einigen Stellen statt rjmp rcall benutzt, dann aber kein RET, daher hatte ich dann immer einen Stack overflow.
Hier der einwandfrei funktionierende text:

Zitat:

.nolist
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m8535def.inc"
.list

.def vorrueck=r16
.def counter=r17
.def AR1=r18
.def AR2=r19
.def gezaehlt=r20
.def hilfszaehler=r21
rjmp main

main:

ldi AR1,LOW(RAMEND) ;Stackpointer
out SPL,AR1
ldi AR1,HIGH(RAMEND)
out SPH,AR1

ldi AR1, 0x00 ;DataDirection D für Input
out DDRD, AR1

ldi AR1, 0xFF ; Port D alles auf 1 Setzen (1=alles aus)
out PORTD, AR1

ldi AR1, 0xFF ; Datadirection B auf 0 also Eingang
out DDRB, AR1 ; Port B alles 1 damit alle LDS aus
out PORTB, AR1

ldi gezaehlt, 1
loop:
in AR2, PIND
rcall pruefen_reset
rcall ausgabe
rjmp loop






pruefen_reset:
ldi AR1, 0xFF
cpse AR1, AR2
rjmp pruefen_vor
rcall entprellen
ldi gezaehlt, 0
ret

pruefen_vor:
ldi AR1, 0xFE
cpse AR1, AR2
rjmp pruefen_rueck
rcall entprellen
ldi vorrueck, 1
rjmp pulse

pruefen_rueck:
ldi AR1, 0xFD
cpse AR1, AR2
rjmp pulse
rcall entprellen
ldi vorrueck, 2
rjmp pulse

pulse:
ldi AR1, 0xFC
cpse AR1, AR2
ret
rcall entprellen
ldi AR1, 0
cpse AR1, gezaehlt
ret
ldi gezaehlt, 1
ldi AR1, 0xFE
cpse AR1, vorrueck
rjmp decrease
rjmp increase

decrease:
dec counter
ret

increase:
inc counter
ret

ausgabe:
mov R1, counter
com R1
out PORTB, R1
ret

entprellen:
clr hilfszaehler
loop2:
in AR2, PIND
cpse AR1, AR2
rjmp loop
inc hilfszaehler
ldi AR2, 2
cpse hilfszaehler, AR2
rjmp loop2
ret




Alle Zeitangaben in WEZ +2. Es ist jetzt 04:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag