Forum: Mikrocontroller und Digitale Elektronik LED Steuerung


von regaa (Gast)


Lesenswert?

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.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Welches Atmel Evulationsboard? Schaltplan?

von regaa (Gast)


Lesenswert?

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?

von Ich (Gast)


Lesenswert?

Vor der Sleep-Instruktion muss der Sleep-Mode enabled werden. Ein paar 
Bits setzen im MCUCR. Sonst rennt der Prozessor weiter.

von Johannes M. (johnny-m)


Lesenswert?

Das Programm läuft in einer ungewollten Endlosschleife, weil der sleep 
nicht initialisiert ist. Das gibt am Ende einen Soft-Reset (Neustart)...

von regaa (Gast)


Lesenswert?

...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?

von Johannes M. (johnny-m)


Lesenswert?

regaa wrote:
> ...sonst rennt der Prozessor weiter? Wohin denn? Fängt das Programm dann
> von vorne an?
Ja.

von regaa (Gast)


Lesenswert?

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.

von Skua (Gast)


Lesenswert?

Die Tasten erzeugen in der Originalbeschaltung Zufallsreaktionen.
http://www.mikrocontroller.net/articles/Pollin_ATMEL_Evaluations-Board

von Johannes M. (johnny-m)


Lesenswert?


von regaa (Gast)


Lesenswert?

Und wie kann ich im Schaltplan erkennen das PORTD und DDRD mit den 
Werten 0x11 und 0x12 versehen sind?

von regaa (Gast)


Lesenswert?

Danke für den Link. Werde ich bei Zeiten durchlesen.

von Gast Posti (Gast)


Lesenswert?

@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

von Steffen (Gast)


Lesenswert?

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

von Steffen (Gast)


Lesenswert?

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).

von Steffen (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.