So langsam macht es Spaß...aber dennoch brennt sich bei mir die Logik
nicht ins Brain. Ich habe einen folgenden Code:
.include "tn2313def.inc"
.cseg
rjmp start
.org 0x50
start:
NOP
in r16, PIND
cpi r16,5
brge groesser
rjmp ende
groesser:
ldi r16, 0xFF
ldi r17, 0x00
out DDRD, r16
out DDRB, r17
out DDRA, r17
out PORTD, r16
out PORTB, r17
out PORTA, r17
ende:
sleep
Sobald ich einen Taster drücke am Atmel Evulationsboard gehen die LEDs
an. Warum? Wie ist denn der Lebenszyklus dieses Programms? Ist es nicht
so das das Programm von oben nach unten abgearbeitet wird und wenn zum
Zeitpunkt als der PIND eingelesen werden sollte der Taster nicht
gedrückt war, müsste das Programm doch zum ende: springen. Aber sobald
ich das Board resete kann geraume Zeit verfliegen und das Programm
springt nicht zum ende sondern nirgendswohin...erst wenn ich auf einen
Taster drücke (seltsamerweise egal welchen von den 3en) springt es zur
Marke groesser. Kann ich mit der von mir erwarteten Logik nicht
vereinaberen. Meine Frage lautet auch, wie ich nur einen der 2 leds
leuchten lassen kann. Ich habe da wohl einen gewaltigen Denkfehler.
http://www.pollin.de/shop/detail.php?pg=NQ==&a=MTY5OTgxOTk=
Mit ihr nachschauen müsst:
ATMEL Evaluations-Board Version 2.0.1 - Bausatz
Diese Platine zum Anschluss an den PC ermöglicht die direkte
Programmierung der ATmega8535, ATmega8, ATmega16, ATmega32, ATmega64,
ATtiny2313, ATtiny12 und ATtiny15.
Aufgrund der vorhandenen Elemente wie Taster, LEDs, Buzzer und serieller
Schnittstelle ist eine einfache und zügige Anwendungsentwicklung
möglich. Alle diese Komponenten können bei Bedarf einzeln über Jumper
verbunden oder getrennt werden.
Technische Daten:
- Betriebsspannung 9 V~
- ISP- und JTAG-Anschluss
- ISP to seriell integriert
- serieller Anschluss über MAX232
- 3 Programmtaster
- 2 LEDs
- 1 Buzzer
- Port PA, PB, PC, PD auf 40-polige Pfostenleiste herausgeführt
Den Schaltplan habe ich glaub ich im Benutzerhandbuch oder aber hier:
http://www.pollin.de/shop/downloads/D810038B.PDF (Seite 6). Aber für
mich zum größten Teil unverständlich.
Und eine grundsätzliuche Frage: In der Headerdatei steht z.B. für DDRD
0x11 oder 0x12 weis nicht mehr genau. Ich weis wohl das es für 17 bzw.
18 steht, aber woher sehe ich wowas im Schaltplan?
...sonst rennt der Prozessor weiter? Wohin denn? Fängt das Programm dann
von vorne an? Erfindet er sich den Rest des Programms oder gibt es gar
Standardroutinen die ausgeführt werden wenn kein Code mehr zum
abarbeiten gibt?
ahhhh....d.h. das Programm wird immer wider von vorne gestartet.
Soso....Das erklärt einiges. Warum und wie muss ich einen Sleep-Modus
initialisieren.
Es ist so: Ich programmiere schon seit 10 Jahren über viele Anwendungen
und Spiele hinweg. Habe mehrere Webportale laufen. Auf der Arbeit
verlässt man sich auch auf mich was Softwareprogrammierung angeht. Im
Elektrotechnikbereich habe ich folgendes Wissen anzubieten: R = U * I.
Ich versuche in Sachen Elektrotechnik einfach die Logik aufzufangen und
erhoffe mir allein dadurch irgendeinen Aha-Effekt. Bisher ohne Erfolg.
Deswegen entschuldigt bitte meine bisher grenzenlos dummen Fragen.
@Rega
Soll kein Oberlehrerspruch sein (wundert mich, daß da noch keiner drauf
angesprungen ist)
U=RxI
Damit das Rechnen damit leichter ist, gibt's das URI-Dreieck:
1
U
2
-----
3
R x I
Das soll ein Bruch darstellen, die Größe, die gesucht wird, wird
zugedeckt, die Formel erscheint.
R=U:I
I=U:R
und U=RxI
Gibt auch noch für die Leistung das PUI-Dreieck
1
P
2
-----
3
U x I
Auch wieder die Größe zuhalten, die gesucht wird.
z.B. P (Leistung)=U x I
Wenn der Prozessor 'irgendwohin' weiter rennt, greift dann der W-Dog?
MfG
Im Schaltplan kannst du das gar nicht erkennen. Die 0x11 und 0x12 sind
die Port-Adressen im AVR selbst (Hardwareseitig). Der Name PORTD und
DDRD sind im Headerfile (tn2313.inc) einfach nur dieser Adressen
zugeordnet worden. Dadurch musst du in deinem Programm nicht immer
ldi r16, 0xFF ( 0xFF = 255 = 0b11111111 )
out PORTD, r16 ( HEX = DEC = BIN Bit:76543210 )
out 0x12, r16 ( ist das selbe wie "out PORTD, r16")
mfg
Steffen
Huch, da fehlt ja noch der Rest des Satzes...
Dadurch musst du in deinem Programm nicht immer 0x12 schreiben, wenn du
den PORTD ansprechen willst. Übrigens besteht im Atmel ein Port aus 3
Registern die 8Bit breit sind. Dem Datenrichtungsregister DDRx (z.B.
Bit0: 0= Eingang ; 1= Ausgang), der direkten Pinabfrage im Register PINx
und dem Portregister PORTx. Hier gibt es allerdings 2 Bedeutungen: Wenn
ein Bit im DDRx = Eingang ist, dann kann man mit dem zugehörigem Bit im
Portregister PORTx durch eine logische "1" dem Eingangspin einen
internen Pullup-Widerstand zuschalten. Ist der Port (oder nur ein
einzelner Portpin, z.B. PD3 durch eine logische "1" im DDRD im Bit3) als
Ausgang definiert, so führt nun PD3 "High-Level"(beim ATtiny2313 Pin7,
siehe Schaltplan von Pollin).
Ach ja, deine Taster liegen auf PD2 -> Taster1; PD3 -> Taster2; PD4 ->
Taster3. Die LED´s liegen an PD5 -> LED1 und PD6 -> LED2.
Und mittels dem Befehl "sbi" kannst du ein Bit in allen
Hardwareregistern wie PORTx einzeln ansprechen.
Bit5 (PD5) in PORTD setzen:
sbi PORTD, 5
oder
sbi PORTD, PD5 (PD5 ist ebenfalls in der tn2313 mit 5 definiert)
Um erste ergebnisse zu erziehlen:
.include "tn2313def.inc"
.cseg
rjmp MCU_RESTART
.org 0x13
MCU_RESTART:
;STACK initialisieren
ldi r16, low(RAMEND) ; Stackpointer initialisieren
out SPL, r16 ; muss in jedes Programm
; als erstes mit eingebunden werden
sbi DDRD, PD5 ; PD5 ist Ausgang (LED1)
sbi DDRD, PD6 ; PD6 ist Ausgang (LED2)
GetPinD:
cbi PORTD, PD5 ; PD5 =0 (LED1 ausschalten)
in r16, PIND
andi r16, 0b00011100 ;UND-Maske auf PIND um nur die Taster zu
dedektieren
cpi r16, 4 ; Abfrage von PD2 (Taster1)
breq SetLED1
rjmp GetPinD
SetLED1:
sbi PORTD, PD5 ; PD5 =1 (LED1 leuchtet wenn nur Taster1 gedrückt)
rjmp GetPinD