Forum: Mikrocontroller und Digitale Elektronik invertierten UART Empfangen mit Atmega88


von Sebastian B. (sebastian_)


Lesenswert?

Hi,

ich möchte UART gern in Software invertieren (Empfang).

Dazu verbinde ich die UART Leitung mit Pin D2 und verbinde Pin C5 mit 
RXD.

Immer wenn wenn ein Pin change auf D2 kommt, ändere ich C5 was dann in 
den RXD Pin geht.

Problem ist: es kommt hin und wieder zu bitfehlern (selten, aber sie 
kommen), die nicht auftreten wenn ich die invertierung in hardware 
mache.

Das ist der Code:


ISR(PCINT2_vect)
{
    if(PIND & (1<<PIND2))
    {
        PORTC &= ~(1<<PORTC5);
    }
    else
    {
        PORTC |= (1<<PORTC5);
    }
}


void PCINT_Init()
{
    PCMSK2 |= (1<<PCINT18); // D2
    PCICR |= (1<<PCIE2);
}


Jemand ne Idee ?


Grüsse
Sebastian

von AVR-Fan (Gast)


Lesenswert?

Ufff, so irre Idee hab ich noch nie gesehen.
Klar daß das Probleme machen kann. Ein Hardware Inverter
braucht gerade mal die Gatterlaufzeit, einige ns.
Per SW umdrehen, das dauert unterschiedlich lange,
jenach dem wann der Int kommt. Es muß ja noch der vorige
Befehl abgearbeitet werden, das kann dann schon mal
die Flanke des Signals um 1µs..2µs verschieben,
kommt halt auf die Clock-Frequenz des µC an.
Und das ist je nach Baudrate halt zu viel.

von Mirko B. (Gast)


Lesenswert?

Nimm doch einfach einen Transistor + Basis-R als Inverter (pull up an), 
das passt zur Not auch noch fliegend auf eine fertige Platine.

Viele Grüße,

Mirko

von Martin (Gast)


Lesenswert?

Welche Baudrate verwendest du? Wie oft kommt es zu Bitfehlern?

von Leo B. (luigi)


Lesenswert?

hast du evtl noch andere Interrupts, oder atomare codeabschnitte, in 
denen du interrupts abschaltest? beides könnte den von AVR-Fan 
beschriebenen Fehler zufällig auftreten lassen.

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.