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
intmain(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
return0;
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:
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.
Hallo, danke für deine Antwort.
Meine Frage lautet wie ich das Programm umschreiben kann das es mir auf
die uart Schnittstelle die drei Werte schickt. Welcher Typ muss es sein?
wie könnte das zum beispiel ausschauen?
Da bist ja nicht estgelegt. Gib doch einfach Ganzzahlen aus, oder ein
Byte Vor- ein Byte Nachkomma. Da es ja dein eigenes "Protokoll" ist,
hintert dich auch keiner daran 'A' als 5V 'B' als 10V 'C' als 5,1V und
'56' als 9,999V zu definieren.
hm.. ich versteh nicht ganz was du damit meinst..
ich habe diese 3 spannungen an 3 verschiedenen ports vom adc am µC. ich
will diese 3 werte einfach an die uart schicken. meine frage lautet wie
der code dazu aussehen könnte.. ich kenn mich leider wenig damit aus :S
Ja, schon richtig. Vier gehen auf und vier gehen zu.
Nur stehen sie augenscheinlich an der falschen Stelle!
Wo ist denn die schließende Klammer zur folgenden Funktion?
uint16_t adc(uint8_t admux)
>ja ja :)
Dafür hätte man dir hier im hohen Norden glatt eins reingeh....
>weisst du vielleicht wie ich das realisieren könnte was ich will?
So im grobem schon, aber die Aufgabe wurde DIR gestellt !
Ich bin nur der Kammerjäger ;)
Du willst immer noch 'nur' die ADC-Werte an den PC schicken?
fang doch mal 'klein'an:
Erster schritt
- initialisiere:
- ADC (mit ADLAR=1, halte es einfach und lies nur ADCH!)
- USART
- Messe (oder miss?! :P)
- schick das Ergebnis an den PC
Nächster Schritt (Nur wenn das Programm aus dem ersten Schritt
einwandfrei funktioniert):
- ADC mit ADLAR=0;
- Messe
- sende beide Bytes
- bei Empfange entsteht ein Problem: welches der zwei Bytes ist
welches
- simpelste Lösung, z.b. itoa() (aus <stdlib.h>)
- sende eben einen string und kennzeichne Anfang und Ende
Dritter Schritt (optional)
- überleg dir ein binäres Protokoll, ohne den string
und (NICHT optional) lies das AVR-GCC-Tutorial
hth. Jörg
es funktioniert alles.. ich hab es ja schon getestet mit einer einzelnen
spannung und die wird mir auch ausgegeben.
meine frage lautet wie könnte ich die 3 definieren soll ich es mit int
oder char machen?
ich hab mir da was überlegt und zwar folgendes:
int wert1,wert2,wert3;
char daten[16];
sprinft(daten,"[%d|%d|%d]",wert1,wert2,wert3);
senden(daten); //das hier is dann das senden auf die schnittstelle
_
könnte mir vielleicht jemand weiterhelfen? ob ich das so realisieren
könnte? und wie ich das mit dem avr-studio machen könnte?
wobei wert1,wert2,wert3 immer der wert von dem jeweiligen adc-port ist.
danke euch