Forum: Projekte & Code Kleines Programm für Debug Ausgaben


von Harry S. (littlegonzo)


Angehängte Dateien:

Lesenswert?

Hallo,
hier ist ein kleines Programm um Debug Ausgaben über einen Software-Uart
machen zu können. Es wird auch die Positionierung für ANSI Terminals 
benutzt.
Hoffe das es einige nutzen können.
Das ist übrigens mein erstes C-Programm was ich veröffentliche, also 
zerreißt mich nicht gleich ;-)


Grüße
Littlegonzo

von Stefan (Gast)


Lesenswert?

Easy zu implementieren und geht auch recht sparsam mit dem Speicher um.
Den ANSI-Kram kann man bei Bedarf löschen und spart so noch mal einiges.

Die Baudrate muss im Terminaprogramm auf 19200 eingestellt werden, wenn 
die AVR-Routine auf 9600 parametriert wurde !


Vielen Dank, hat mir wirklich sehr geholfen :)

Stefan


---

von Jörg E. (jackfritt)


Lesenswert?

Also bei mir kommen dort nur wirre Zeichen am Terminal raus egal was ich 
an delay einstelle.

Ich habe den delay von 1 bis 65535 durchlaufen lassen und jedesmal 
"Hallo" ausgegeben. Im Terminalprogramm(putty) ab 2400 mit 
Standardwerten nach oben angefangen. Nix vernünftiges bei rausgekommen.

Gruss,

Jörg

von Peter D. (peda)


Lesenswert?

1
#define F_CPU           8e6
2
#define BAUD            9600
3
#define STX_PORT        PORTB
4
#define STX_BIT         0
5
6
#define TX_SRAM         0
7
#define TX_FLASH        1
8
9
#include <util/delay.h>
10
#include <avr/io.h>
11
#include <avr/pgmspace.h>
12
13
void sputchar( uint8_t c )
14
{
15
  c = ~c;
16
  STX_PORT &= ~(1<<STX_BIT);            // start bit
17
  for( uint8_t i = 10; i; i-- ){        // 10 bits
18
    _delay_us( 1e6 / BAUD );            // bit duration
19
    if( c & 1 )
20
      STX_PORT &= ~(1<<STX_BIT);        // data bit 0
21
    else
22
      STX_PORT |= 1<<STX_BIT;           // data bit 1 or stop bit
23
    c >>= 1;
24
  }
25
}
26
27
void sputs( char *pt, uint8_t flag )
28
{
29
  uint8_t val;
30
31
  for(;;){
32
    if( flag )
33
      val = pgm_read_byte( pt );
34
    else
35
      val = *pt;
36
    if( val == 0 )
37
      return;
38
    sputchar( val );
39
    pt++;
40
  }
41
}
42
43
prog_char ftext[] = { "Hallo Peter\n" };
44
45
int main()
46
{
47
  for(;;){
48
    sputs( ftext, TX_FLASH );
49
    sputs( "Text im SRAM\n", TX_SRAM );
50
    _delay_ms( 1000 );
51
  }
52
}

Peter

von Jörg E. (jackfritt)


Lesenswert?

Hallo Peter,

danke für deinen Code den ich schon in etwas "älterer"
Version getestet hatte.

Ich habe ihn trotzdem nochmal als ganz neues Projekt in Eclipse kopiert 
und noch folgende Änderungen gemacht:
1
PORTB |= ( 0 << PB4 );          //Pullup-aus
2
DDRB |= (1 << PB4);            //PB4 Output für TX

und

//#define F_CPU           8e6  //ist schon definiert mit 8Mhz
#define STX_BIT         PB4

Leider sehe ich in putty terminal nur folgendes als output:
"▒::
   ▒▒▒5W5▒-%▒Y[}e▒"

zzt. nutze ich eine deiner anderen Codeaschnipsel mit Timer und das geht 
prima.
Da ich den Timer aber ändern muss bzw. für etwas anderes brauche
wollte ich auf eine ohne umsteigen.
Aber scheinbar hängt mein interner Oszi total daneben. Ich
habe keine Idee mehr.

Ich nutze das übrigens zzt. mit einem attiny85.

Gruss,

Jörg

von Peter D. (peda)


Lesenswert?

Jörg Esser schrieb:
> DDRB |= (1 << PB4);            //PB4 Output für TX

Ups, hatte ich noch vergessen.

Jörg Esser schrieb:
> Ich nutze das übrigens zzt. mit einem attiny85.

Und auch mit Pegelwandler?
Für direkt an RS-232 muß man die Bitbefehle umkehren.


Peter

von Jörg E. (jackfritt)


Lesenswert?

Ohne Pegelwandler deswegen habe ich auch schon probiert
1
//c = ~c;
"$▒▒▒▒▒Җ▒**▒҂▒▒▒J6*"
und
1
//c = ~c;
"▒::
   ▒▒▒5W5▒-%▒Y[}e▒"

Oder habe ich nen Denkfehler mit dem auskommentieren ?

Gruss,

Jörg

von Jörg E. (jackfritt)


Lesenswert?

Oh ich glaube du hast mich in die richtige richtung geschickt.
Pegel invertieren, nich die Daten oder ? ;)

Gruss,

Jörg

von Jörg E. (jackfritt)


Lesenswert?

Na also klappt doch. Vielen Dank für den Wink mit dem Zaunpfahl.
1
//#define F_CPU           8e6
2
#define BAUD            9600
3
#define STX_PORT        PORTB
4
#define STX_BIT         PB4
5
6
#define TX_SRAM         0
7
#define TX_FLASH        1
8
9
#include <util/delay.h>
10
#include <avr/io.h>
11
#include <avr/pgmspace.h>
12
#define TX_INVERT 1
13
void sputchar( uint8_t c )
14
{
15
  c = ~c;
16
#if !TX_INVERT
17
  STX_PORT &= ~(1<<STX_BIT);            // start bit
18
#else
19
  STX_PORT |= 1<<STX_BIT;
20
#endif
21
  for( uint8_t i = 10; i; i-- ){        // 10 bits
22
    _delay_us( 1e6 / BAUD );            // bit duration
23
#if !TX_INVERT
24
    if( c & 1 )
25
      STX_PORT &= ~(1<<STX_BIT);        // data bit 0
26
    else
27
      STX_PORT |= 1<<STX_BIT;           // data bit 1 or stop bit
28
#else
29
    if( c & 1 )
30
      STX_PORT |= 1<<STX_BIT;        // data bit 0
31
    else
32
      STX_PORT &= ~(1<<STX_BIT);           // data bit 1 or stop bit
33
    c >>= 1;
34
#endif
35
  }
36
}
37
38
void sputs( char *pt, uint8_t flag )
39
{
40
  uint8_t val;
41
42
  for(;;){
43
    if( flag )
44
      val = pgm_read_byte( pt );
45
    else
46
      val = *pt;
47
    if( val == 0 )
48
      return;
49
    sputchar( val );
50
    pt++;
51
  }
52
}
53
54
prog_char ftext[] = { "Hallo Peter\n" };
55
56
int main()
57
{
58
    PORTB |= ( 0 << PB4 );          //Pullup-aus
59
    DDRB |= (1 << PB4);            //PB4 Output für TX
60
  for(;;){
61
    sputs( ftext, TX_FLASH );
62
    sputs( "Text im SRAM\n", TX_SRAM );
63
    _delay_ms( 1000 );
64
  }
65
}
Ausgabe
"Hallo Peter
           Text im SRAM"
...

Endlich Wochenende ;)

Gruss,

Jörg

von Jörg E. (jackfritt)


Lesenswert?

Damit sollte dann auch das ursprüngliche Programm von ganz oben laufen 
:)

Achja und meine Routine mit Timer0 läuft nun auch :)

Thx, an alle

Jörg

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.