mikrocontroller.net

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


Autor: Harry S. (littlegonzo)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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


---

Autor: Jörg Esser (jackfritt)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define F_CPU           8e6
#define BAUD            9600
#define STX_PORT        PORTB
#define STX_BIT         0

#define TX_SRAM         0
#define TX_FLASH        1

#include <util/delay.h>
#include <avr/io.h>
#include <avr/pgmspace.h>

void sputchar( uint8_t c )
{
  c = ~c;
  STX_PORT &= ~(1<<STX_BIT);            // start bit
  for( uint8_t i = 10; i; i-- ){        // 10 bits
    _delay_us( 1e6 / BAUD );            // bit duration
    if( c & 1 )
      STX_PORT &= ~(1<<STX_BIT);        // data bit 0
    else
      STX_PORT |= 1<<STX_BIT;           // data bit 1 or stop bit
    c >>= 1;
  }
}

void sputs( char *pt, uint8_t flag )
{
  uint8_t val;

  for(;;){
    if( flag )
      val = pgm_read_byte( pt );
    else
      val = *pt;
    if( val == 0 )
      return;
    sputchar( val );
    pt++;
  }
}

prog_char ftext[] = { "Hallo Peter\n" };

int main()
{
  for(;;){
    sputs( ftext, TX_FLASH );
    sputs( "Text im SRAM\n", TX_SRAM );
    _delay_ms( 1000 );
  }
}

Peter

Autor: Jörg Esser (jackfritt)
Datum:

Bewertung
0 lesenswert
nicht 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:
PORTB |= ( 0 << PB4 );          //Pullup-aus
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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Esser (jackfritt)
Datum:

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

Oder habe ich nen Denkfehler mit dem auskommentieren ?

Gruss,

Jörg

Autor: Jörg Esser (jackfritt)
Datum:

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

Gruss,

Jörg

Autor: Jörg Esser (jackfritt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na also klappt doch. Vielen Dank für den Wink mit dem Zaunpfahl.
//#define F_CPU           8e6
#define BAUD            9600
#define STX_PORT        PORTB
#define STX_BIT         PB4

#define TX_SRAM         0
#define TX_FLASH        1

#include <util/delay.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#define TX_INVERT 1
void sputchar( uint8_t c )
{
  c = ~c;
#if !TX_INVERT
  STX_PORT &= ~(1<<STX_BIT);            // start bit
#else
  STX_PORT |= 1<<STX_BIT;
#endif
  for( uint8_t i = 10; i; i-- ){        // 10 bits
    _delay_us( 1e6 / BAUD );            // bit duration
#if !TX_INVERT
    if( c & 1 )
      STX_PORT &= ~(1<<STX_BIT);        // data bit 0
    else
      STX_PORT |= 1<<STX_BIT;           // data bit 1 or stop bit
#else
    if( c & 1 )
      STX_PORT |= 1<<STX_BIT;        // data bit 0
    else
      STX_PORT &= ~(1<<STX_BIT);           // data bit 1 or stop bit
    c >>= 1;
#endif
  }
}

void sputs( char *pt, uint8_t flag )
{
  uint8_t val;

  for(;;){
    if( flag )
      val = pgm_read_byte( pt );
    else
      val = *pt;
    if( val == 0 )
      return;
    sputchar( val );
    pt++;
  }
}

prog_char ftext[] = { "Hallo Peter\n" };

int main()
{
    PORTB |= ( 0 << PB4 );          //Pullup-aus
    DDRB |= (1 << PB4);            //PB4 Output für TX
  for(;;){
    sputs( ftext, TX_FLASH );
    sputs( "Text im SRAM\n", TX_SRAM );
    _delay_ms( 1000 );
  }
}

Ausgabe
"Hallo Peter
           Text im SRAM"
...

Endlich Wochenende ;)

Gruss,

Jörg

Autor: Jörg Esser (jackfritt)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.