Hallo,
ich komme zur Zeit irgendwie nicht so ganz zurecht mit der
Avr-Programmierung von dem Atmega8. Es geht darum, dass ich 3 Spannungen
in den ADC von dem atmega8 reinschicken will auf 3 verschiedene ports,
und diese Spannungen möchte ich einfach auf die uart schnittstelle
senden.
Als Versuch ob die Kommunikation zwischen PC und µC in Ordnung ist hab
ich folgendes Programm in den Flash-Speicher geschrieben:
1 | #include <avr/io.h>
|
2 |
|
3 | #define BAUD 9600L
|
4 | #define F_CPU 12000000L
|
5 | #define UBRR_BAUD ((F_CPU/(16L*BAUD))-1)
|
6 |
|
7 | int main(void)
|
8 | {
|
9 |
|
10 | UBRRH = (uint8_t) (UBRR_BAUD>>8);
|
11 | UBRRL = (uint8_t) (UBRR_BAUD & 0xFF);
|
12 |
|
13 | UCSRB =(1<<TXEN);
|
14 | UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
|
15 |
|
16 | while(1){
|
17 | while(!(UCSRA & (1<<UDRE)))
|
18 | {
|
19 | }
|
20 |
|
21 | UDR='x';
|
22 | }
|
23 | return 0;
|
24 | }
|
Das Zeichen x das ich schicke kriege ich ins Terminalprogramm, also die
Kommunikation passt.
Nun kommt erst mein richtiges Problem und zwar, da ich Neuling auf dem
Gebiet bin, weiß ich nicht wie ich diese 3 Spannungen definieren soll?
Brauche ich einen Interrupt? Ich habe mir vorgestellt das ungefähr 10
mal in der sekunde abgetastet werden soll, also ein delay von 100ms und
die Ausgabe so erfolgen soll: Spannung1,Spannung2,Spannung3
Ein Programm für den ADC habe ich und zwar sieht das folgendermaßen aus:
1 | inline void uart_init(uint8_t tx, uint8_t rx)
|
2 | {
|
3 | uint16_t baudrate;
|
4 | baudrate = UART_BAUD_RATE/2;
|
5 | UBRRH = (uint8_t) (UART_UBRR_CALC(baudrate,F_CPU)>>8);
|
6 | UBRRL = (uint8_t) UART_UBRR_CALC(baudrate,F_CPU);
|
7 | UCSRA |= (1<<U2X);
|
8 | UCSRB |= (1<<RXCIE);
|
9 | if(tx) UCSRB |= (1<<TXEN);
|
10 | if(rx) UCSRB |= (1<<RXEN);
|
11 | sei();
|
12 | pause(1);
|
13 | }
|
14 | void uart_putc(uint8_t c)
|
15 | {
|
16 | while (!(UCSRA & (1<<UDRE)));
|
17 | UDR = c;
|
18 | }
|
19 | void uart_puti(uint16_t data)
|
20 | {
|
21 | uint8_t buffer[7];
|
22 | uart_puts(utoa(data, buffer, 10));
|
23 | }
|
24 | uint16_t adc(uint8_t admux)
|
25 | {
|
26 | ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);
|
27 | ADMUX = admux;
|
28 | ADMUX |= (1<<REFS1) | (1<<REFS0);
|
29 | ADCSRA |= (1<<ADSC);
|
30 | while (ADCSRA & (1<<ADSC));
|
31 | uint16_t val = ADCW;
|
32 | ADCSRA &= ~(1<<ADEN);
|
33 | return val;
|
34 | int main(void)
|
35 | {
|
36 | uint8_t i;
|
37 | uart_init(1, 1);
|
38 | while(1) // Unendlich lang wiederholen
|
39 | {
|
40 | for(i=0;i<6;i++)
|
41 | {
|
42 | uart_puti(adc(i));
|
43 | uart_putc(' ');
|
44 | }
|
45 | uart_putc('\n');
|
46 | _delay_ms(200);
|
47 | }
|
48 | }
|
49 | }
|
Wäre nett wenn ihr mir helfen könnt :( Übrigens das ist mein
Diplomprojekt und zwar geht es um eine Ganganalyse die mit einem
Gehstock aufgenommen wird, an dem ein Drucksensor und ein zweiachsiger
Neigungssensor befestigt sind, diese drei Spannungen möchte ich nur
digitalisieren und die Daten mit MATLAB erfassen.
Danke im vorhinein.