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
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 ---
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
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
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
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
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
Oh ich glaube du hast mich in die richtige richtung geschickt. Pegel invertieren, nich die Daten oder ? ;) Gruss, Jörg
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.