Forum: Mikrocontroller und Digitale Elektronik ATMEGA88 BOD wird ausgelöst sobald PINC2 auf low geht


von Helge O. (_elko_)


Lesenswert?

Moin,

ich habe einen ATMEGA88 mit dem ich ein Drehencoderinterface bauen will. 
Ich habe am PORTC zwei Drehencoder angeschlossen. Der Erste verwendet 
PC0,1 der Zweite PC2,3. Die Pins sind als Eingänge konfiguriert, die 
Pullups sind aktiviert. Die Encoder schalten gegen GND.

Ich habe mich an dem Beispiel vom Drehencoderartikel bei der 
Softwaregestaltung inspirieren lassen. Soweit so gut, Drehencoder 1 an 
PC0,1 arbeitet ohne Probleme. Sobald man jedoch einen Rastpunkt des 
Encoders an PC2,3 weiterdreht wird sofort der RESET des Mikrocontrollers 
ausgelöst.

Ich habe mittlerweile herausgefunden, dass der RESET durch die BOD 
ausgelöst wird. Bei deaktivierter bzw. BODLEVEL = 1V8 funktioniert alles 
ohne Probleme. Bei einem BODLEVEL > 1V8 wird der Reset beim drehen des 
zweiten Encoders ausgelöst.

Des Weiteren habe ich herausgefunden, dass NUR der Pin PC2 hierfür 
verantwortlich ist. Das Phänomen ist durch direktes Kurzschließen von 
PC2 gegen GND mit aktivierter BOD reproduzierbar.

Ich stehe etwas auf dem Schlauch und weiß um ehrlich zu sein nicht so 
recht weiter. VCC und AVCC haben jeweils einen eigenen 100nF 
kondensator, der knapp 2mm neben den Pins liegt. AREF hat einen 100nF 
Stützkondensator. (Irgendwo habe ich mal gelesen, dass dieser 
installiert werden soll, auch wenn der ADC nicht genutzt wird.)

So wirklich erklären kann ich mir das nicht. Die beiden VCC Pins und der 
AVCC Pin wurden von mir schon mal mit dem Oszi beobachtet, keinerlei 
Peaks oder Einbrüche auf der Versorgungsspannung. Der Controller wurde 
auch schon versuchsweise einmal getauscht, ändert nichts an der 
Situation.

Hat jemand eine gute Idee, was noch dafür verantwortlich sein könnte, 
dass der BOD-Reset ausgelöst wird?

: Bearbeitet durch User
von spess53 (Gast)


Lesenswert?

Hi

Vielleicht sind deine Eingänge doch Ausgänge.

MfG Spess

von Helge O. (_elko_)


Lesenswert?

Moin,

spess53 schrieb:
> Vielleicht sind deine Eingänge doch Ausgänge.

Habs gegengecheckt.
1
DDRC &= ~((1<<DDC0) | (1<<DDC1) | (1<<DDC2) | (1<<DDC3));
2
PORTC |= (1<<PORTC0) | (1<<PORTC1) | (1<<PORTC2) | (1<<PORTC3);

Das ist die Einstellung für den Port. Wenn es Ausgänge wären, dann würde 
das Drehencoderinterface ja auch mit ausgeschalteter BOD nicht 
funktionieren. Sobald diese aus ist arbeitet es aber einwandfrei.

Ich habe auch schon probiert externe Pullups zu verwenden. Verändert 
leider auch nichts.

: Bearbeitet durch User
von spess53 (Gast)


Lesenswert?

Hi

>Sobald diese aus ist arbeitet es aber einwandfrei.

BOD kennt nicht nur ein- oder ausgeschaltet. Bei welchem BOD-Level 
funktioniert es nicht mehr? Wie sieht deine Stromversorgung aus?

MfG Spess

von Helge O. (_elko_)


Lesenswert?

spess53 schrieb:
> BOD kennt nicht nur ein- oder ausgeschaltet. Bei welchem BOD-Level
> funktioniert es nicht mehr? Wie sieht deine Stromversorgung aus?

Das habe ich in meinem ersten Post bereits geschrieben.

Helge O. schrieb:
> Ich habe mittlerweile herausgefunden, dass der RESET durch die BOD
> ausgelöst wird. Bei deaktivierter bzw. BODLEVEL = 1V8 funktioniert alles
> ohne Probleme. Bei einem BODLEVEL > 1V8 wird der Reset beim drehen des
> zweiten Encoders ausgelöst.

Sobald ein BODLEVEL > 1V8 eingestellt ist löst die BOD beim 
herunterziehen von PC2 aus.

von Sven (Gast)


Lesenswert?

Helge O. schrieb:
> Das habe ich in meinem ersten Post bereits geschrieben.

Nö, da ist die Rede von Kondensatoren, aber nicht wie VCC bereitgestellt 
wird. Zeige doch einfach Schaltplan und Bild vom Aufbau und dann kann 
man auch schneller suchen....

Sonst bleibt nur: Lötfehler, Platine defekt, Programm defekt.

LG Sven

von Karl H. (kbuchegg)


Lesenswert?

Helge O. schrieb:

> Sobald ein BODLEVEL > 1V8 eingestellt ist löst die BOD beim
> herunterziehen von PC2 aus.


Ich würde erst mal einen Gegentest mit einem möglichst einfachen 
Programm machen
(wie kannst du Resets feststellen? Hast du irgendwo eine LED, die dazu 
dienen könnte?)
1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
#define LED_DDR  DDRB
5
#define LED_PORT PORTB
6
#define LED_PIN  PB0
7
8
int main()
9
{
10
  LED_DDR |= (1<<LED_PIN);
11
12
  PORTC |= ( 1 << PC2 );
13
14
  LED_PORT &= ~(1<<LED_PIN);
15
  _delay_ms( 1000 );
16
  LED_PORT |= (1<<LED_PIN);
17
  _delay_ms( 1000 );
18
  LED_PORT &= ~(1<<LED_PIN);
19
20
  while( 1 )
21
    ;
22
}

und dann den Pin PC2 nochmal auf Masse schliessen. An besagter LED darf 
sich nach dem ersten Blinker direkt nach Anlegen der Versorgung nichts 
tun.
Wenn doch, dann hast du ein Hardwareproblem. Irgendwas mit deiner 
Stromversorgung.
Wenn sich nichts tut, dann würde ich mal nicht ausschliessen, dass du in 
deinem Encoderprogramm einen Fehler hast und dir irgendwo die 
Portkonfiguration zerschiesst.

: Bearbeitet durch User
von Helge O. (_elko_)


Angehängte Dateien:

Lesenswert?

Sven schrieb:
> Nö, da ist die Rede von Kondensatoren, aber nicht wie VCC bereitgestellt
> wird. Zeige doch einfach Schaltplan und Bild vom Aufbau und dann kann
> man auch schneller suchen....

Quelle ist ein DF-1730SB Labornetzgerät welches auf 5V eingestellt ist. 
"Minimalschaltplan" habe ich angehängt, eine zusätzliche LED ist auch 
noch vorhanden.

Karl Heinz schrieb:
> Wenn doch, dann hast du ein Hardwareproblem. Irgendwas mit deiner
> Stromversorgung.

Lötfahnen oder sonstige Kurzschlussverursacher kann ich ausschließen. 
Der µC wurde schon von der Platine heruntergenommen (ist nen TQFP), alle 
Pins wurden Gegeneinander gemessen.

Karl Heinz schrieb:
> Ich würde erst mal einen Gegentest mit einem möglichst einfachen
> Programm machen
> (wie kannst du Resets feststellen? Hast du irgendwo eine LED, die dazu
> dienen könnte?)

So etwas ähnliches habe ich mir geschrieben:
1
#include <avr/io.h>
2
3
int main(void)
4
{
5
  DDRD |= (1<<DDD6);    // LED Ausgang
6
  DDRC &= ~(1<<DDC2);    // Eingang
7
  
8
  
9
  PORTC |= (1<<PORTC2);    // Pullup ein
10
  
11
    while(1)
12
    {
13
        PORTD |= (1<<PORTD6);
14
    }
15
}

Mittlerweile habe ich gerausgefunden, dass offenbar die steile Flanke 
durch den Inkrementalgeber an PC2 schuld ist für das Auslösen der BOD.

Die Versorgungsspannung habe ich direkt am µC-Pin Oszilloskopiert, da 
sieht man leider absolut gar nichts.

von Karl H. (kbuchegg)


Lesenswert?

Helge O. schrieb:

> Mittlerweile habe ich gerausgefunden, dass offenbar die steile Flanke
> durch den Inkrementalgeber an PC2 schuld ist für das Auslösen der BOD.

Sowas ähnliches haben sich die meisten hier wohl schon gedacht.

Du hast aber nicht 'zufällig' an den Encoderpins ein paar kleinere 
Kondensatoren zur Entprellung angebracht?

> Die Versorgungsspannung habe ich direkt am µC-Pin Oszilloskopiert, da sieht man 
leider absolut gar nichts.

Ist nicht weiter verwunderlich. Ein paar einzelne Spikes im 
Nanosekundenbereich wirst du dort auch nicht sehen können. Aber die BOD 
spricht darauf an.

: Bearbeitet durch User
von Helge O. (_elko_)


Lesenswert?

Karl Heinz schrieb:
> Du hast aber nicht 'zufällig' an den Encoderpins ein paar kleinere
> Kondensatoren zur Entprellung angebracht?

Anfangs hingen da 100pF dran, die sind mittlerweile runtergeflogen. Hat 
nichts verändert.

Karl Heinz schrieb:
> Ist nicht weiter verwunderlich. Ein paar einzelne Spikes im
> Nanosekundenbereich wirst du dort auch nicht sehen können. Aber die BOD
> spricht darauf an.

Versteh ich aber dann trotzdem nicht. Selbst wenn ich einen externen 
Pullup, sagen wir mal 10k, verwende dann passiert das.

von Sven (Gast)


Lesenswert?

Hmm,

dann würde ich testweise die Stromversorgung tauschen gegen einen
7805 mit Hühnerfutter drumherum.

Ganz sicher das es auch 100nF keramische Kondensatoren sind ?
Nicht dass diese einen zu kleinen Wert haben......

LG Sven

von Helge O. (_elko_)


Lesenswert?

Sven schrieb:
> Ganz sicher das es auch 100nF keramische Kondensatoren sind ?
> Nicht dass diese einen zu kleinen Wert haben......

Jap 100nF Keramik.


So wie es aussieht habe ich den Fehler gefunden: Der im Schaltplan 
vorhandene C15. Den habe ich eben aus lauter Verzweifelung 
heruntergeschmissen, mit dem Ergebnis, dass die BOD nicht mehr ausgelöst 
wird.

Warum ausgerechnet der daran die Schuld trägt ist mir jedoch 
schleierhaft...

von Jüntha (Gast)


Lesenswert?

>Warum ausgerechnet der daran die Schuld trägt ist mir jedoch
>schleierhaft...

Du hast es mit Elektronik zu tun....

Wer da nicht an Wunder glaubt, ist kein Realist.

Jruß Jüntha

von Sebastian W. (wangnick)


Lesenswert?

Karl Heinz schrieb:
> Ist nicht weiter verwunderlich. Ein paar einzelne Spikes im
> Nanosekundenbereich wirst du dort auch nicht sehen können. Aber die BOD
> spricht darauf an.

Ist das so? "The BOD circuit will only detect a drop in VCC if the 
voltage stays below the trigger level for longer than tBOD given in 
“System and reset characteristics” on page 307" und dort "tBOD, Min 
pulse width on brown-out reset, 2 µs"?

Ich frage, weil mich die brown-out-Logik zur Zeit bei meinem Projekt 
auch umtreibt ...

Helge O. schrieb:
> So wie es aussieht habe ich den Fehler gefunden: Der im Schaltplan
> vorhandene C15. Den habe ich eben aus lauter Verzweifelung
> heruntergeschmissen, mit dem Ergebnis, dass die BOD nicht mehr ausgelöst
> wird.
>
> Warum ausgerechnet der daran die Schuld trägt ist mir jedoch
> schleierhaft...

Hast du die interne 1.1V-Referenz als ADC-Input ausgewählt und dadurch
an AREF angekoppelt? Dann bekonnst du eventuell Störungen auf GND (z.B. 
durch den Drehencoder) durch C15 auf die interne 1.1V-Referenz 
eingekoppelt, die dann ja auch für die BOD-Erkennung benutzt wird ("The 
Atmel ATmega48/88/168 features an internal bandgap reference. This 
reference is used for brown-out detection, and it can be used as an 
input to the analog comparator or the ADC").

Jüntha schrieb:
> Wer da nicht an Wunder glaubt, ist kein Realist.

Ich glaube an Wunder. Es ist z.B. ein Wunder dass es uns gibt. In Bezug 
auf Elektronik bevorzuge ich allerdings weniger wunderliche Erklärungen.

LG, Sebastian

: Bearbeitet durch User
von Helge O. (_elko_)


Lesenswert?

Moin,

Sebastian Wangnick schrieb:
> Hast du die interne 1.1V-Referenz als ADC-Input ausgewählt und dadurch
> an AREF angekoppelt?

ne, beim ADC ist gar nichts kofiguriert (siehe Software, die ich oben 
gepostet habe).

Jüntha schrieb:
> Du hast es mit Elektronik zu tun....
>
> Wer da nicht an Wunder glaubt, ist kein Realist.

Jeder vertritt da seine eigene Meinung. Ich glaube eher, dass es zu 
jedem praktischen Problem auch einen theoretischen Ansatz gibt. Man muss 
nur den richtigen finden.

von Sven (Gast)


Lesenswert?

Ich bleibe bei Problemen mit der Spannungsversorgung.

C15 stabilisiert ARef.
Intern wird sie benutzt für den BOD.

Baust Du C15 aus, läuft die interen Refspannung mit der Spannung für
BOD. Damit läuft der Prozessor.

Das Problem ist aber nicht weg.

Mein Vorschlag:

C15 einbauen.
10µH an AVCC wie im Datenblatt von VCC + 100nF an AVCC.

Spannungsquelle 7805 + Hühnerfutter! und 9V vom Netzteil oder Batterie.

Gruß Sven

von Sven (Gast)


Lesenswert?

Sven schrieb:
> läuft die interen Refspannung mit der Spannung für
> BOD

Damit meine ich mit-laufen / gleichlaufen

von Thomas (kosmos)


Lesenswert?

ich denke auch das es die Stromversorgung ist. Da fehlen sämtliche 
Puffer C's, der Filter für AVCC wurde ja auch schon genannt und wenn ein 
10kOhm Pullup gegen GND schon für Probleme sorgt dürfte die 
Spannungsversorgung sehr schwach ausgelegt sein.

Mit welcher Frequenz läuft dein AVR nicht das der mit Volldampf fährt 
und dann eine höhere Betriebsspannung braucht, war bei den älteren Typen 
so, da gingen 8 MHz z.B. nur mit 5V Versorgungssapnnung.

JTAG ist deaktiviert(kann man per Software machen), falls es dieser Typ 
hat, sonst haben deine Pins vielleicht doch ne andere Funktion? Nicht 
das da ein Ausgang auf GND gelegt wird dann wäre es kein Wunder wenn die 
Spannung einbricht oder das Netzteil in die Strombegrenzung geht.

von Dietrich L. (dietrichl)


Lesenswert?

Ein Möglichkeit wäre noch:

Sven schrieb:
> C15 stabilisiert ARef.
> Intern wird sie benutzt für den BOD.
>
> Baust Du C15 aus, läuft die interen Refspannung mit der Spannung für
> BOD. Damit läuft der Prozessor.

Ein Möglichkeit wäre noch: Masseproblem.

Wie hängen die Abblock-C's am µC? Ganz nahe? Ist der GND "solide"?
Je nach Aufbau könnte der µC beim Arbeiten seinen GND "hüpfen" lassen, 
und diese Störungen werden über C15 in AREF eingekoppelt.

Gruß Dietrich

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.