Kleines Programm für Debug Ausgaben

OP #540566
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
Angehängte Dateien:
Gast #653402
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


---
#2878948
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
#2879253
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
#2879529
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
#2879618
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

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