ungewollte komische interne-Verspätung von dem Microcontroller ATMEGA32A

OP (Firma: Student) #7124235
Lesenswert?

Vielen Dank für die Umfangreiche Webseite.

Ich benutze einen ATMEGA32A mit einem 16MHz extern Oszilattor für ein 
Projekt für meine Bachelorarbeit.
Das Projekt ist ein Schaltung entwürfen, um ein extern-Signal zu lesen 
und später drauf antworten zu können(Simulationsgerät).
Das Signal kommt von einem 12Volt Gerät.
Ich habe eine Spannungsteiler benutzt um den Pin des Microcontroller von 
der 12 Volt zu schützen.
meine Spanungsteiler Widerstände sind:
R1= 100KOhm und R2=50KOhm.

Während programmieren gab es immer eine Komische Verspätung beim Lesen 
des PIN von dem Microcontroller, und ich wüsste nicht woran sie liegen 
könnte, deswegen habe den einfache Code in meiner while schleife 
geschrieben, um die Verhalten des Microkontroller mit dem Oszilloskop zu 
untersuchen bzw. genauer anzugucken:
 while (1)
      {
      // Place your code here
      if (PIND.0) PORTC.0=0;
        else PORTC.0=1;
      }

Trotzt dem einfachen Code ist der Ausgangsspannung (PortC) immer noch 
mit 3.2Microsekunde verspätet( sehe Anhang ).
Hat jemand mal dieses Problem gehabt?.
gibt es einen Kondensator in dem Aufbau des Pin in dem Microkontroller, 
der u dieser Verspätung führt? oder woran könnte diese Verspätung 
legen?.
Ich freue mich auf eure Antworte.
Vielen Danke im Voraus!.

der Gesamte Code ist:

Chip type               : ATmega32A
Program type            : Application
AVR Core Clock frequency: 16.000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 512
*******************************************************/

// I/O Registers definitions
#include <mega32a.h>

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In 
Bit0=In
DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | 
(0<<DDA2) | (0<<DDA1) | (0<<DDA0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | 
(0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);

// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In 
Bit0=In
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | 
(0<<DDB2) | (0<<DDB1) | (0<<DDB0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | 
(0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

// Port C initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In 
Bit0=Out
DDRC=(0<<DDC7) | (0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | 
(0<<DDC2) | (0<<DDC1) | (1<<DDC0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=0
PORTC=(0<<PORTC7) | (0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | 
(0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);

// Port D initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In 
Bit0=In
DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | 
(0<<DDD2) | (0<<DDD1) | (0<<DDD0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | 
(0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);


while (1)
      {
      if (PIND.0) PORTC.0=0;
        else PORTC.0=1;
      }
}
Angehängte Dateien:
#7124292
Lesenswert?

Saad Y. schrieb:
> Danke für Ihre Antwort, ich glaube die Fuses sind richtig gestellt.?

Das kann man dort nicht sehen, denn das sind ja nicht die ausgelesenen 
Fuses. Das sind Einstellungen, welche programmiert werden SOLLEN! Aber 
der Haken dafür fehlt, also wird nicht programmiert.

Du must die Fuses direkt auslesen, das geht im Microchip Studio unter 
Progamm Target / Read Fuses etc.
Angehängte Dateien:
Gast #7124323
Lesenswert?

Saad Y. schrieb:
> Ich habe eine Spannungsteiler benutzt um den Pin des Microcontroller von
> der 12 Volt zu schützen.
> meine Spanungsteiler Widerstände sind:
> R1= 100KOhm und R2=50KOhm.

Deine 'Quelle' hat damit 33 kOhm. Bei einer 'Last' von 100 pF 
(Steckbrett) gibt das schon mal ein tau = 1/(R*C) = 3.3 usec ...

Just my 2 ct
Gast #7124345
Lesenswert?

Werner schrieb:
> Deine 'Quelle' hat damit 33 kOhm. Bei einer 'Last' von 100 pF
> (Steckbrett) gibt das schon mal ein tau = 1/(R*C) = 3.3 usec

Die gebe Linie auf dem Oszilloskop bestätigt dies. Das Gelbe Signal 
erreicht den LOW Pegel erst verzögert.

Und die rote Linie (ich nehme an, das ist PORTC.0) folgt den Logik 
Pegeln prompt ohne sichtbare Verzögerung. In dem Moment wo das gelbe 
Signal den LOW Pegel erreicht, geht es auf HIGH. Und in dem Moment wo 
das gelbe Signal den HIGH Pegel erreicht, geht es auf Low.

Saad Y. schrieb:
> Ich benutze einen ATMEGA32A mit einem 16MHz extern Oszilattor für ein
> Projekt für meine Bachelorarbeit.

Warum benutzt so ein uraltes Modell?
Beitrag #7124383 wurde von einem Moderator gelöscht.
Beitrag #7124406 wurde von einem Moderator gelöscht.
Beitrag #7124417 wurde von einem Moderator gelöscht.
Beitrag #7124429 wurde von einem Moderator gelöscht.
Gast #7124450
Lesenswert?

Saad Y. schrieb:
> Trotzt dem einfachen Code ist der Ausgangsspannung (PortC) immer noch
> mit 3.2Microsekunde verspätet( sehe Anhang ).
> Hat jemand mal dieses Problem gehabt?.
> gibt es einen Kondensator in dem Aufbau des Pin in dem Microkontroller,
> der u dieser Verspätung führt? oder woran könnte diese Verspätung
> legen?.

Die Flanke des gelben Signals (Vermutlich das Signal nach dem 
Spannungsteiler) ist nicht gerade schnell.

Dei digitaler Kanal (grün) hat wahrscheinlich eine andere 
Schaltschwelle, als der ATMega.

Der Spannungsteiler hat ja auch kapazitäten. Du könntest ihn, ähnlich 
wie ein Tastkopf am Oszilloskop auch, mit zwei Kondensatoren versehen 
und diese dann so anpassen, dass das Zeitverhalten Deines 
Spannungsteilers besser wird (steilere Flanke).

Ansonsten, könntest Du auch hingehen und den unteren Widerstand duch 
eine 3,9V (oder 4,7V) Z-Diode ersetzen. Dadurch wird die Flanke 
vermutlich auch steiler. Kapazitiv abstimmen halte ich aber für die 
elegantere Lösung.

Werner
Beitrag #7124456 wurde von einem Moderator gelöscht.
Beitrag #7124609 wurde von einem Moderator gelöscht.
Beitrag #7124683 wurde von einem Moderator gelöscht.
OP (Firma: Student) #7125521
Lesenswert?

vielen Dank für alle euere Antworte.

Ich habe den Spannungsteiler Faktor 10 kleiner genommen und somit die 
Verspätung von max. 3.3Microsecunde zu max. 700 ns verkleinert wurden.
diese 700 ns wird leider 10 mal großer wenn ich irgendwelchen Timer in 
dem Microcontroller benutze, um den Pin abzufragen und das Signal zu 
lesen.
Es ist auf jeden fall schon mal viel besser als vorher, da die 
Verspätungen schon mal halb so groß wie vorher sind.
Gast #7125548
Lesenswert?

Saad Y. schrieb:
> diese 700 ns wird leider 10 mal großer wenn ich irgendwelchen Timer in
> dem Microcontroller benutze, um den Pin abzufragen und das Signal zu
> lesen.

Ja natürlich. Timer lösen nun mal nur zu bestimmten Intervallen aus, und 
dann vergehen auch noch einige uC-Takte für die PC- und Stackverwaltung 
bevor die Interruptroutine überhaupt abgearbeitet wird.

LG, Sebastian
Gast #7125576
Lesenswert?

Saad Y. schrieb:
> vielen Dank für alle euere Antworte.
> Ich habe den Spannungsteiler Faktor 10 kleiner genommen und somit die
> Verspätung von max. 3.3Microsecunde zu max. 700 ns verkleinert wurden.
> diese 700 ns wird leider 10 mal großer wenn ich irgendwelchen Timer in
> dem Microcontroller benutze, um den Pin abzufragen und das Signal zu
> lesen.
> Es ist auf jeden fall schon mal viel besser als vorher, da die
> Verspätungen schon mal halb so groß wie vorher sind.

Warum lässt du dein Eingangssignal keinen Interrupt auslösen?
OP (Firma: Student) #7125592
Lesenswert?

Dyson schrieb:
> Saad Y. schrieb:
>> vielen Dank für alle euere Antworte.
>> Ich habe den Spannungsteiler Faktor 10 kleiner genommen und somit die
>> Verspätung von max. 3.3Microsecunde zu max. 700 ns verkleinert wurden.
>> diese 700 ns wird leider 10 mal großer wenn ich irgendwelchen Timer in
>> dem Microcontroller benutze, um den Pin abzufragen und das Signal zu
>> lesen.
>> Es ist auf jeden fall schon mal viel besser als vorher, da die
>> Verspätungen schon mal halb so groß wie vorher sind.
>
> Warum lässt du dein Eingangssignal keinen Interrupt auslösen?

weil der PIN, an dem ich mein Input verbunden habe kein Interrupt 
unterstützt und wenn ich mehr als ein Eins nacheinander habe dann kann 
ich nur ein Interrupt lesen bzw. nur ein Eins lesen und so mit kann ich 
nicht das ganze 20 Bit Signal richtig lesen.
Gast #7125593
Lesenswert?

Dyson schrieb:
> Warum lässt du dein Eingangssignal keinen Interrupt auslösen?

Und was ändert das grundsätzlich?
Auch der Interrupt erzeugt eine gewisse Verzögerung, die sich aus 
Registersicherung und dem eigentliche Code zum Setzen des Ausgangspins 
ergibt.

Wenn es wirklich schnell gehen soll, ist festverdrahtete Logik/CPLD/FPGA 
der richtige Weg. Durch Tiefpassfilterung verschliffene Flanken sind 
natürlich auch dort Gift.
Gast #7125602
Lesenswert?

Saad Y. schrieb:
>> Warum lässt du dein Eingangssignal keinen Interrupt auslösen?
>
> weil der PIN, an dem ich mein Input verbunden habe kein Interrupt
> unterstützt und wenn ich mehr als ein Eins nacheinander habe dann kann
> ich nur ein Interrupt lesen bzw. nur ein Eins lesen und so mit kann ich
> nicht das ganze 20 Bit Signal richtig lesen.

Da stehst Du Dir mit dem Atmega32A natürlich sehr gründlich auf dem Fuß 
herum.

Neuere AVRs bieten einen "pin change interrupt" und können somit jeden 
I/O-Pin als Interruptquelle benutzen.

Was für ein "20-Bit-Signal" ist das, das jetzt hier urplötzlich 
auftaucht?

Beschreib doch dieses "Signal" mal etwas genauer; was ist der maximale 
Takt dieses "Signals", was für ein Gerät erzeugt dieses "Signal", und 
gibt es nur genau eine Leitung dafür?
Gast #7125610
Lesenswert?

Mir ist überhaupt noch nicht klar, ob die Verzögerung minimiert werden 
soll, oder ob er nur eine Erklärung für die Verzögerung haben wollte.

Saad, wenn da was optimiert werden soll, dann brauchen wir viel mehr 
Infos zum Anwendungsfall.
Gast #7125771
Lesenswert?

Wolfgang schrieb:
> Dyson schrieb:
>
>> Warum lässt du dein Eingangssignal keinen Interrupt auslösen?
>
> Und was ändert das grundsätzlich?
> Auch der Interrupt erzeugt eine gewisse Verzögerung, die sich aus
> Registersicherung und dem eigentliche Code zum Setzen des Ausgangspins
> ergibt.
> Wenn es wirklich schnell gehen soll, ist festverdrahtete Logik/CPLD/FPGA
> der richtige Weg. Durch Tiefpassfilterung verschliffene Flanken sind
> natürlich auch dort Gift.

Weil das Signal dann nicht 5 Minuten warten muss, bis der Timer sich 
bequemt, es irgendwann mal abzufragen.

Aber da gerade eine neue Salamischeibe aufgetaucht ist…

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren