Forum: Mikrocontroller und Digitale Elektronik printf() und PB1


von Klemens (Gast)


Angehängte Dateien:

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ß

von Klemens (Gast)


Lesenswert?

Ups, die Farben sind in den Bildern unterschiedlich. Aber Ihr erkennt ja 
Txd. ;-)

von Georg G. (df2au)


Lesenswert?

Wohin soll denn printf() seine Ausgabe schreiben? Was hast du da 
definiert?

von Klemens (Gast)


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.

von Stefan F. (sfrings)


Lesenswert?

Das sieht man doch. Er leitet die Ausgabe auf den seriellen Port.

Printf belegt temporär einige zig Bytes RAM auf dem Stack. Ist der Rest 
des Programms vielleicht so Speicher-Hungrig, daß der Stack über läuft?

von Klemens (Gast)


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. :-(

von Cyblord -. (cyblord)


Lesenswert?

Und der RAM? Wieviel ist da belegt?

von Hans Peter B. (Gast)


Lesenswert?

printf ("abcdef");
beeinflusst eine der 3 Alternativ-Funktionen von PB0, die nicht durch 
die enstsprechende FUSE unterdrückt ist?
Hans Peter

von Klemens (Gast)


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.

von Stefan F. (sfrings)


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.

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.