Ich habe mal ne Frage, wie ich den eingelesenen Int Wert vom AD Wandler, auf der seriellen Schnittstelle abgebe Wie funktioniert das mit dem String? Hier mal mein Code: #define F_CPU 3686400 #include <avr/io.h> #include <util/delay.h> #include <stdint.h> #include <inttypes.h> void USART_Init() { UBRRH = 0; /*9600 Baud */ UBRRL = 23; UCSRB = (1<<RXEN)|(1<<TXEN); UCSRC |= (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); /* 8 Datenbits, kein Parity Bit, ein Stoppbit */ } void USART_Transmit() { while ( !( UCSRA & (1<<UDRE)) ) { } UDR = '8'; return 0; } void io() { int x; DDRC = 0x00; } int main(void) { io(); USART_Init(); int x; while(1) { ADCSR = 0b11000101; while (bit_is_set(ADCSR,6)); x=ADCW; USART_Transmit(); } }
-Du schreibst dir ne Funktion, die ein Zeichen übers UART ausgibt -Du schreibst ne Funktion, die einen String übergeben kriegt und ihn Zeichen für Zeichen an die erste Funktion übergibt -Du benutzt zb itoa, um deinen int in einen String zu wandeln. -Du sendest diesen String an die zweite Funktion
Danke, probier das gerade mit: int x(unsigned char c) { while ( !( UCSRA & (1<<UDRE)) ) /* warte, bis UDR bereit */ { } UDR = c; /* sende Zeichen */ return 0;
>klappt nur irgendwie nicht...
Schade...
DA muß man wohl noch etwas umformen. Z.B. Ein int nach char...
1 | #define F_CPU 3686400
|
2 | |
3 | #include <avr/io.h> |
4 | #include <stdlib.h> |
5 | |
6 | char buffer[5]; // 16-Bit => 4 Hexadezimalstellen + 1 Nullbyte |
7 | |
8 | void USART_Init() |
9 | {
|
10 | UBRRH = 0; /* 9600 Baud */ |
11 | UBRRL = 23; |
12 | UCSRB = (1<<RXEN)|(1<<TXEN); |
13 | /* 8 Datenbits, kein Parity Bit, ein Stoppbit */
|
14 | UCSRC |= (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); |
15 | }
|
16 | |
17 | void USART_Transmit(char c) |
18 | {
|
19 | while ( !( UCSRA & (1<<UDRE)) ) |
20 | {
|
21 | }
|
22 | UDR = c; |
23 | }
|
24 | |
25 | void io() |
26 | {
|
27 | DDRC = 0x00; |
28 | }
|
29 | |
30 | int main(void) |
31 | {
|
32 | io(); |
33 | USART_Init(); |
34 | |
35 | while(1) |
36 | {
|
37 | unsigned int x; |
38 | char *s; |
39 | |
40 | // ADC Einlesen
|
41 | ADCSR = 0b11000101; // ungeprüft, da zu kryptisch |
42 | while (bit_is_set(ADCSR,6)); // ungeprüft, da zu kryptisch |
43 | x = ADCW; |
44 | |
45 | // ADC Umwandeln in String einer 4-steligen Hexadezimalzahl
|
46 | s = buffer; |
47 | /*
|
48 | siehe:
|
49 | http://www.mikrocontroller.net/articles/FAQ#itoa.28.29
|
50 | http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#g4f6b3dd51c1f8519d5b8fce1dbf7a665
|
51 | */
|
52 | itoa(x, s, 16); |
53 | |
54 | // String ausgeben
|
55 | while (*s) |
56 | USART_Transmit(*s++); |
57 | |
58 | // Zeilenvorschub und Wagenruecklauf
|
59 | USART_Transmit('\n'); |
60 | USART_Transmit('\r'); |
61 | }
|
62 | }
|
Umformen wäre ganz gut ;-)
1 | char buffer[10]; |
2 | int num=123; |
3 | |
4 | itoa(num,buffer,10); |
Damit sollte aus dem int ein char geworden sein. Es kann auch gut sein, dass der buffer nur 7 Zeichen groß sein muss und bei itoa dann auch keine 10 hin muss, das habe ich grade so aus dem Kopf mal hingeschrieben. Die einzelnen Zeichen im Puffer musst du dann getrennt senden, also mit einer Schleife den Puffer durchgehen und senden. Wenn du mit deiner Methode sendest, funktioniert es auch mit Werten bis 256. Allerdings stehen diese dann nicht im Hyperterminal direkt als Zahl, sondern das Programm wandelt dann dein Zeichen in ein ASCII-Zeichen um (google mal nach einer ASCII-Tabelle, sende dann eine "108" und erfreue dich am auftauchenden Buchstaben) Quarzoszillator hast du dran? Mit dem internen Takt kann es (sehr wahrscheinlich) mit dem UART Probleme geben.
Hi, die Übertragung funktioniert, aber er sendet alle Zahlen direkt nacheinander...Wie kriege ich da Zeilenumbrüche rein?? \n geht ja nicht ;)
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.