Forum: Mikrocontroller und Digitale Elektronik AVR ganzer Port auslesen


von TM F. (p_richner)


Lesenswert?

Hallo zusammen

Ich möchte in einem Interrupt einen ganzen Port, an dem Taster sind, 
auslesen und diesen Wert in einen Buffer schreiben. Ich benutze 
CodeBlocks und einen Attiny48.
Die Taster werden per Software entprellt. Der Grundzustand der Taster 
ist 0xFC(DEFAULT_VALUE_PORTD)

Hier ist der Code:
1
ISR(TIMER0_COMPA_vect)
2
{
3
    // stop the counter
4
    TCCR0A &= ((0<<CS02) & (0<<CS01) & (0<<CS00));
5
6
    uint8_t tmp_portd = 0;
7
    tmp_portd = DDRD;
8
    tmp_portd = ((tmp_portd ^ DEFAULT_VALUE_PORTD) & 0x93);
9
    // Write the active switch into the buffer
10
    bufferIn(tmp_portd);
11
    // clear interrupt flag
12
    PCIFR = 0x00;
13
    
14
    // enable interrupt at PORTD
15
    PCMSK2 |= 0xFF;
16
}

Ich möchte herausfinden, welcher Taster geändert. Wenn ich jedoch 
debugge, wird immer nur der selbe Wert(220) in den Buffer geschrieben.
Wie muss ich es ändern, dass nur das aktive Bit in den Buffer 
geschrieben wird?

MfG und danke im Voraus

von asdf (Gast)


Lesenswert?

TM F. schrieb:
> Ich möchte in einem Interrupt einen ganzen Port, an dem Taster sind,
> auslesen

Was mir da auf Anhieb auffällt, du liest nicht den Port aus, sondern das 
Direction Register...

TM F. schrieb:
> tmp_portd = DDRD;

von TM F. (p_richner)


Lesenswert?

asdf schrieb:
> Was mir da auf Anhieb auffällt, du liest nicht den Port aus, sondern das
> Direction Register...

Mit

tmp_portd = PORTD;

funktioniert es auch nicht.

von Felix P. (fixxl)


Lesenswert?

Besser noch mal nachlesen:
https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Zugriff_auf_IO-Ports

Und die Anweisung
1
TCCR0A &= ((0<<CS02) & (0<<CS01) & (0<<CS00));
tut auch nur in diesem Fall zufällig das, was sie soll. So löscht man 
keine Bits:
https://www.mikrocontroller.net/articles/Bitmanipulation

von asdf (Gast)


Lesenswert?

TM F. schrieb:
> asdf schrieb:
>> Was mir da auf Anhieb auffällt, du liest nicht den Port aus, sondern das
>> Direction Register...
>
> Mit
>
> tmp_portd = PORTD;
>
> funktioniert es auch nicht.

Ist ja auch klar, dsa ist das AUSGABE-Register des Ports, welches du 
hier liest. Es gibt noch ein drittes Register :-)
Ich will mal nicht so sein. Es heißt PIND...

von TM F. (p_richner)


Lesenswert?

asdf schrieb:
> Es heißt PIND...
Danke.
Dachte mit PINDx kann man nur einzelne Pins auslesen und nicht direkt 
das ganze Register.

von Karl M. (Gast)


Lesenswert?

Nein,

PINDx sind nur die Bitnummern des Registers PIND, also nichts mit 
Auslesen.
Besser wäre es doch mal das Datenblatt zu nehmen und ganz hinter, sich 
allen Registern zu beschäftigen.

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.