1 | #include <avr/io.h>
|
2 | #include <avr/pgmspace.h> // für PSTR()
|
3 | #include <stdlib.h>
|
4 |
|
5 | //#define F_CPU 14745600 // evtl. bereits via Compilerparameter definiert
|
6 |
|
7 | #define BAUD 19200 // Baudrate
|
8 | #include <util/setbaud.h> // festlegen
|
9 |
|
10 | void uart_init(void){
|
11 | UBRR0H = UBRRH_VALUE; // Baudrate
|
12 | UBRR0L = UBRRL_VALUE; // einstellen
|
13 | #if USE_2X // U2X-Modus erforderlich
|
14 | UCSR0A |= (1 << U2X0);
|
15 | #else // U2X-Modus nicht erforderlich
|
16 | UCSR0A &= ~(1 << U2X0);
|
17 | #endif
|
18 | UCSR0B |= (1<<TXEN0); // Transmitter ein
|
19 | UCSR0C = (1<<UCSZ01)|(1<<UCSZ00); // Frame Format: Asynchron 8N1
|
20 | }
|
21 |
|
22 | void uart_putc(char c){
|
23 | while (!(UCSR0A & (1<<UDRE0))){} // warten bis Senden moeglich
|
24 | UDR0 = c; // sende Zeichen
|
25 | }
|
26 |
|
27 | void uart_puts(char *s){ // puts ist unabhaengig vom Controllertyp
|
28 | while (*s){ // so lange *s != String-Endezeichen
|
29 | uart_putc(*s); // Zeichen ausgeben
|
30 | s++; // Stringzeiger erhöhen
|
31 | }
|
32 | }
|
33 |
|
34 | void uart_puts_P(const char *s){ // puts_P ist unabhaengig vom Controllertyp
|
35 | register char tempchar; // Speicher für ein Byte
|
36 | while((tempchar = pgm_read_byte(s++))){ // Zeichen aus Flash lesen bis != String-Endezeichen
|
37 | uart_putc(tempchar); // Zeichen ausgeben
|
38 | }
|
39 | }
|
40 |
|
41 | void ConvTemp2Str(uint8_t msb, uint8_t lsb, char* pointer){ // Scratchpadbytes in Temperatur wandeln
|
42 | uint8_t komma = lsb & 0x01; // Nachkommastelle merken
|
43 | if(msb) lsb = 0xFF - lsb + 1; // wenn negativ Kehrwert bilden
|
44 | lsb >>= 1; // durch 2 teilen
|
45 | if(msb){ *pointer++ = '-';} // wenn negativ dann Vorzeichen in String
|
46 | //else{ *pointer++ = '+';} // wenn positives Vorzeichen gewünscht
|
47 | uint8_t temp = lsb / 10; // zehner Stelle isolieren
|
48 | if(temp){ *pointer++ = ('0' + temp);} // keine führende Null dann Ziffer in String
|
49 | *pointer++ = ('0' + (lsb % 10)); // einer Stelle isolieren und Ziffer in String
|
50 | *pointer++ = '.'; // Dezimalpunkt in String
|
51 | if(komma) *pointer++ = '5'; // Nachkommastelle auswerten, halbes Grad
|
52 | else *pointer++ = '0'; // Nachkommastelle auswerten, volles Grad
|
53 | *pointer = 0; // String abschliessen
|
54 | }
|
55 |
|
56 | void PrintTemp2Uart(uint8_t msb, uint8_t lsb){ // Ausgabe der Temperatus über Uart
|
57 | char Buffer[6]; // String Buffer
|
58 | ConvTemp2Str(msb, lsb, Buffer); // Temperatur in String
|
59 | uart_puts(Buffer); // String zur Uart
|
60 | uart_puts_P(PSTR(" Grad Celsius\r\n")); // Ausgabe der Einheit
|
61 | }
|
62 |
|
63 | int main(void){
|
64 | uart_init();
|
65 | uart_puts_P(PSTR("\r\nProgrammstart\r\n")); // Startmeldung
|
66 | // Testausgabe siehe Datenblatt
|
67 | PrintTemp2Uart(0x00, 0xAA); // 85 Grad Celsius
|
68 | PrintTemp2Uart(0x00, 0x32); // 25 Grad Celsius
|
69 | PrintTemp2Uart(0x00, 0x01); // 0.5 Grad Celsius
|
70 | PrintTemp2Uart(0x00, 0x00); // 0 Grad Celsius
|
71 | PrintTemp2Uart(0xFF, 0xFF); // -0.5 Grad Celsius
|
72 | PrintTemp2Uart(0xFF, 0xCE); // -25 Grad Celsius
|
73 | PrintTemp2Uart(0xFF, 0x92); // -55 Grad Celsius
|
74 | uart_puts_P(PSTR("Fertig\r\n")); // Endemeldung
|
75 | for(;;);
|
76 | }
|