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?
Vor der Sleep-Instruktion muss der Sleep-Mode enabled werden. Ein paar Bits setzen im MCUCR. Sonst rennt der Prozessor weiter.
Das Programm läuft in einer ungewollten Endlosschleife, weil der sleep nicht initialisiert ist. Das gibt am Ende einen Soft-Reset (Neustart)...
...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?
regaa wrote: > ...sonst rennt der Prozessor weiter? Wohin denn? Fängt das Programm dann > von vorne an? Ja.
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.
Die Tasten erzeugen in der Originalbeschaltung Zufallsreaktionen. http://www.mikrocontroller.net/articles/Pollin_ATMEL_Evaluations-Board
Und wie kann ich im Schaltplan erkennen das PORTD und DDRD mit den Werten 0x11 und 0x12 versehen sind?
@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
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.