Forum: Mikrocontroller und Digitale Elektronik Problem beim Debuggen mit PORT


von Ben (Gast)


Lesenswert?

Hallo Community,

ich versuche seit 3 Tagen ein Programm zu schreiben um eine LED über das 
Drücken von einem Taster zu Togglen.

Die Bedingung: Dies soll über einen PORT (hier B) geschehen.
Also genauer PB1 als Eingang - für den Taster.
             PB2 als Ausgang für die LED.

Der Grund: Ich Programmiere mit dem Arduino Board und einem darauf 
enthaltenen ATMEGA 328P, die Software soll aber dann auf einem ATTINY45 
laufen.

Programmiersprache: Assembler.

Das Programm:
1
start:
2
3
 sbi DDRB, 2 ;LED Auf Ausgang
4
 sbi PORTB, 2 ; LED Einschalten
5
 cbi DDRB, 1   ; Pin B 1 als Eingang
6
 cbi PORTB, 1 ; Pullup ausschalten
7
      
8
 ldi r19, 0b00000010    ; lade 2 in r19
9
 ldi r17, 0b00000010    ; lade 2 in r17
10
 mov r3, r17            ; kopiere die 2 in r3
11
12
loop:
13
      sbic PINB,2       ; wenn LED aus über springe den Befehl
14
      in r4, PINB       ; rufe den Taster ab
15
      sbic PINB,1       ;wenn taster gedrückt überspringe den befehl
16
      in   r4, PINB       ; lade Tasterzustand in r4 - hier die dZahl 4
17
      mov r18, r4       ;
18
      sbic PINB,2       ; wenn LED aus überspringe den Befehl
19
      subi r18, 0b00000100 ; ansonsten ziehe die Zahl 4 ab, das   
20
      cpse r18, r19        ;Registerwert 2 ist - entspricht Taster gedrückt
21
      ldi r18, $00
22
      mov  r17, r18         ; sicher den Zustand
23
      or  r18, r3       ; verknüpfe mit dem Sollwert
24
      mov  r3, r17         ; bewege den jetzt zustand in r3 für nächsten
25
  breq loop  
26
         
27
   
28
      and r17, r18       
29
    
30
      breq loop                   
31
 sbis PORTB,2            ; jetzt eine if verzweigung wenn taster gedrückt
32
rjmp ifelse
33
cbi PORTB, 2
34
ldi r20, 0b00000100
35
mov r4,r20
36
rjmp endif
37
ifelse:
38
sbi PORTB, 2
39
40
endif:
41
42
      rjmp loop
43
    rjmp start

Ich hoffe das Programm ist für manchen verständlich.
Ansonsten kommentiere ich gerne nach.

Mein Problem mit dem Debugger:
In dem funktioniert es wenn ich PINB1 setze, also den Taster simuliere.
Ist das eigentlich richtig? Oder muss ich PORTB1 setzen(Debugger).

Mir ist nicht klar: Der ATMEGA liest den PIN aber gibt am PORT aus?

Ich habe viel gelesen und im Internet gesucht, nun such ich mir Hilfe.

von Ben (Gast)


Lesenswert?

Nachschub vom Fragenden:

Kann man überhaupt über einen PORT Ein und Ausgänge vergeben?
Und wenn nein welchen Sinn macht ein ATTINY45, der nur einen PORT hat?

In meiner Simulation (Debug) funktioniert die Software. Ist das richtig 
den PINB zu setzen? Also wird auch bei der Hardware Version der PINB1 
gesetzt?

Die Rechnerei hab ich in der Software weil ja PINB2 durch die LED 
gesetzt ist...

Danke

von Justus S. (jussa)


Lesenswert?

Ben schrieb:
> Der ATMEGA liest den PIN aber gibt am PORT aus?
>
> Ich habe viel gelesen

und das Datenblatt und dazu sämtliche Tutorials einfach ignoriert oder 
wie?

: Bearbeitet durch User
von Benjamin K. (benk2x)


Lesenswert?

Wie meinst du das Justus Skorps?

Ich bin Anfänger die Frage entsteht aus unsicherheit, da die Simulation 
geht nur mit dem Board gehts nicht.

Im Programm muss ich den PIN lesen (Taster) und den PORT setzen (LED) 
dem bin ich mir sicher.

Nur wie verhält sich das dann im Microcontroller wenn ein PIN gelesen 
wird? Wird dann auch der PORT gesetzt?

PORT Register setze ich bei Eingängen für den PULLUP Widerstand das ist 
mir auch klar.

Was mir einfach nicht klar wird warum ich mein Programm super simulieren 
kann, es nur am Controller selbst nicht geht.

von Stefan F. (Gast)


Lesenswert?

Mir dem DDR Register bestimmst du, ob ein Pin als Eingang oder als 
Ausgang arbeitet.

Das PIN Register dient zum Lesen den Zustandes des I/O Pins. Es liest 
den Zustand des I/O Pins unabhängig davon, ob der Pin als Eingang oder 
Ausgang geschaltet ist.

Wenn der I/O Pin ein Eingang ist, bestimmst du mit dem PORT Register, ob 
der interne Pull-Up Widerstand aktiviert sein soll.

Wenn der I/O Pin ein Ausgang ist, bestimmst du mit dem PORT Register, ob 
der I/O Pin High oder Low Pegel ausgibt.

Das PORT Register kann gelesen werden. Es liefert jedoch nicht unbedingt 
den aktuellen Zustand des I/O Pins, sondern den Zustand, den der Pin 
haben sollte. Der Unterschied fällt bei Kurzschluss auf. Wenn du einen 
Ausgang auf High setzt aber mit GND kurzschliesst, dann ist das 
entspreche Bit im PORT Register High, während es im PIN register Low 
ist.

Manche AVR können Ausgangs-Pins Toggeln (umschalten), indem man das 
entsprechende Bit in PIN Register mit 1 beschreibt.

> Nur wie verhält sich das dann im Microcontroller wenn ein
> PIN gelesen wird?

Dann erhälst du den aktuellen Zustand des I/O Pins.

> Wird dann auch der PORT gesetzt?

Nein, beim Lesen eines PIN/PORT/DDR Registers wird nichts gesetzt oder 
verändert.

> Was mir einfach nicht klar wird warum ich mein Programm super
> simulieren kann, es nur am Controller selbst nicht geht.

Vielleicht wiel die Pins für irgendwas anderes reserviert sind? Oder 
weil du die Pins falsch beschaltet hast?

> Ich Programmiere mit dem Arduino Board

Welchem?

Dein programm sieht ziemlich wirr aus, ich kann den Ablauf gar nicht so 
recht am Quelltext ablesen. Zum Beispiel:
1
loop:
2
      sbic PINB,2       ; wenn LED aus über springe den Befehl
3
      in r4, PINB       ; rufe den Taster ab
4
      sbic PINB,1       ;wenn taster gedrückt überspringe den befehl
5
      in   r4, PINB       ; lade Tasterzustand in r4 - hier die dZahl 4
6
      mov r18, r4       ;

Das sagt mir, dass r4 nur dann einen Wert enthält, wenn entweder die LED 
an ist oder der Taster nicht gedrückt ist.

Ansonsten enthält r4 einen zufälligen Wert, und r18 ebenfalls.

von Justus S. (jussa)


Lesenswert?

Benjamin K. schrieb:
> Wie meinst du das Justus Skorps?

das in jedem Tutorial und erst im Datenblatt der Zusammenhang zwischen 
PORTx, PINx und DDRx erklärt wird...

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.