printf() und PB1

Gast #2795299
Lesenswert?

Hallo Gemeinde,

ich habe hier ein seltsames Verhalten bei printf(). Währen printf() 
ausgeführt wird, schaltet der PORT PB1 auf '0'.

Folgenden Code verwende ich auf dem AtMega168:
1
void vfd_write( char data)
2
{
3
   while ( ( UCSR0A & ( 1 << UDRE0)) == 0)
4
   ;
5
   UDR0 = data;
6
}
7

8
int vfd_put ( char data, FILE * stream )
9
{
10
   vfd_write ( data );
11
   return (0);
12
}
13

14
FILE * vfd_out;
15

16
int main ( void )
17
{
18
   vfd_out = fdevopen ( vfd_put, NULL);
19
   while ( 1 )
20
   {
21
      vfd_write ( 0x10 );   // irgend etwas
22
      vfd_write ( 0x18 );    // noch etwas
23
      printf ("abcdef");
24
    
25
      [ ... noch viel anderes ... ]
26
   }
27
   return (0);
28
}

Wenn ich das Programm starte wird während printf() PB1 auf '0' gelegt. 
wie man in Bild scope_11 erkennen kann, sind die Impulse sogar 
verschieden lang. Nehme ich printf() raus, bleibt PB0, wie er war.
Grün ist TxD und gelb ist PB1.

Weiß jemand Rat?

Gruß
Angehängte Dateien:
Gast #2795574
Lesenswert?

Mit:
1
vfd_out = fdevopen ( vfd_put, NULL);
 wird die Ausgabe an 'vfd_put()' gesendet. Das macht der Rechner ja 
auch. Aber zusätzlich schaltet er PB1.

P.S.
die Signale auf dem Scope sind invertiert - also hinter einem Transistor 
gemessen.
Gast #2795671
Lesenswert?

Das Flash ist zu ca. 60% belegt. Das Programm arbeitet auch ganz normal: 
Timer, Interrupts, main() habe ich mir mit dem Scope angesehen (Bit 
setzen/löschen beim Einsprung). Alles okay, bis auf PB1. :-(
Gast #2795737
Lesenswert?

Genau kann ich das erst morgen sagen. Aber geschätzt sind es auch 
ca.50-60%. Wenn der Stack überlaufen würde, dann würde das Programm ja 
nicht mehr laufen. Und es erklärt nicht, warum der Port Pin geschaltet 
wird.

main() läuft mit ca 35kHz. Ich habe vor printf() einen Zähler sitzen der 
z.B. nur bei jedem 30.000sten main-Durchlauf printf() startet. Setzte 
ich den Zähler auf z.B. 15.000 sehe ich am Scope, dass sich die Zeit 
zwischen  den beiden Pulsen halbiert.

Parallel dazu läuft noch Timer1 mit 1ms und ein Pin-Change Interrupt bei 
75kHz. Alles fehlerfrei.
#2795748
Lesenswert?

Mikrocontroller machen immer irgendwas, auch wenn sie abstürzen. Ich 
hatte schon ziemlich oft den Fall, dass sich das Programm nach 
Aussetzern "von selbst" erholt hat, so dass mir der Fehler erst recht 
spät aufgefallen ist.

Bei einem Stack Überlauf wäre ein solches Verhalten durchaus denkbar.

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