toraX
14.02.2006, 15:49
Hallo Leute,
ich hab ein riesen Problem. Ich hock schon seit Tagen vor meinem Rechner und versuch die A/D Werte die mein Atmega32 ins ADC Register schreibt über UART auf meinem PC auszugeben, aber leider vergeblich. Das einzige was auf meinem Bildschirm erscheint sind Unmengen an Buchstaben und Ziffern, also muss doch irgendwas mit itoa oder der UART-Übertragung nicht stimmen. In meinem Programm versuch ich durch drücken einer Taste ein bestimmtes LED zum leuchten zu bringen und zugleich die A/D Werte auszuspucken, die Funktion um die LEDs zum leuchten zu bringen funzt einwandfrei aber bei der UART-Übertragung ist der Wurm drin. Also ich wäre über jede Hilfe dankbar, ist bestimmt ein Witz für euch.
Hier ist mein Code
#include <avr/io.h>
#include "wchar.h"
#include <stdlib.h>
#define SYSCLK 14756000
void init(void);
unsigned int get_key(void);
/*
* Hauptprogramm
*/
int main(void)
{
unsigned int i=0;
char buffer[100];
init();
while(1)
{
/* Ergebnis auslesen und anzeigen */
if(i != 0xff)
{
itoa(i,buffer,2);
write(buffer);
}
i = get_key();
if (i != 0xff)
PORTC = ~(1<<i) & 0x7f;
else
PORTC = 0x7f;
}
return 0;
}
/*
* Initialisierung des µC
*/
void init(void)
{
DDRA = 0x00; /* Port als Eingang deklarieren ( A/D-Wandler Eingänge ) */
PORTA = 0x80;
DDRB = 0xff; /* Port als Ausgang deklarieren */
PORTB = 0x00;
DDRC = 0xff; /* Port als Ausgang deklarieren */
PORTC = 0x00;
DDRD = 0xff; /* Port als Ausgang deklarieren */
PORTD = 0x00;
/* Analog zu Digital Wandler aktivieren ( Prescaler = 128, interne +5V Referenz, "8-Bit" Ergebnis ) */
ADMUX = (1<<REFS0)|(1<<ADLAR);
ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
}
/**
* Fragt die Tasten an AD-Port 7 ab, kann nicht erkennen ob zwei Tasten gleichzeitig gedrückt werden
*
* 255 keine Taste gedrückt
0 Taste 1 gedrückt
1 Taste 2 gedrückt
2 Taste 3 gedrückt
3 Taste 4 gedrückt
4 Taste 5 gedrückt
*/
unsigned int get_key(void)
{
unsigned int i, taste = 0xff;
/* ADC7 mit Vcc als Referenzspannung */
ADMUX = (1<<REFS0)|(1<<ADLAR)|0x07;
/* AD Wandler starten */
ADCSRA |= (1<<ADSC);
/* Warten bis das Ergebniss zur Verfügung steht */
while(!(ADCSRA & (1<<ADIF)));
/* Ergebnis auslesen und anzeigen */
i = ADCH;
if (i < 36)
taste = 4;
else if (i < 57)
taste = 3;
else if (i < 76)
taste = 2;
else if (i < 94)
taste = 1;
else if (i < 150)
taste = 0;
return taste;
}
und noch der Code der Verantwortlich ist für die Ausgabe
#include <avr/io.h>
#include <string.h>
#include <inttypes.h>
void uart_init(void);
int uart_putc(unsigned char c)
{
while (!(UCSRA & (1<<UDRE))); /* warten bis Senden moeglich */
UDR = c; /* sende Zeichen */
return 0;
}
/* puts ist unabhaengig vom Controllertyp */
void uart_puts (char text[])
{
char *s;
s=&(text[0]);
while (*s)
{ /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
uart_putc(*s);
s++;
}
}
void write(char text[])
{
/*Den UART initialisieren*/
uart_init();
uart_puts(text);
}
void uart_init(void)
{
/* USART-Init 19200 Baud bei 16MHz für Mega32 */
UCSRB |= ( 1 << TXEN ); // UART TX einschalten
UCSRC |= ( 1 << URSEL )|( 3<<UCSZ0 ); // Asynchron 8N1
UBRRH = 0; // Highbyte ist 0
UBRRL = 51; // Lowbyte ist 51 ( dezimal )
}
Vielen Dank schon mal im voraus für eure Bemühungen
Gruss
Torsten
ich hab ein riesen Problem. Ich hock schon seit Tagen vor meinem Rechner und versuch die A/D Werte die mein Atmega32 ins ADC Register schreibt über UART auf meinem PC auszugeben, aber leider vergeblich. Das einzige was auf meinem Bildschirm erscheint sind Unmengen an Buchstaben und Ziffern, also muss doch irgendwas mit itoa oder der UART-Übertragung nicht stimmen. In meinem Programm versuch ich durch drücken einer Taste ein bestimmtes LED zum leuchten zu bringen und zugleich die A/D Werte auszuspucken, die Funktion um die LEDs zum leuchten zu bringen funzt einwandfrei aber bei der UART-Übertragung ist der Wurm drin. Also ich wäre über jede Hilfe dankbar, ist bestimmt ein Witz für euch.
Hier ist mein Code
#include <avr/io.h>
#include "wchar.h"
#include <stdlib.h>
#define SYSCLK 14756000
void init(void);
unsigned int get_key(void);
/*
* Hauptprogramm
*/
int main(void)
{
unsigned int i=0;
char buffer[100];
init();
while(1)
{
/* Ergebnis auslesen und anzeigen */
if(i != 0xff)
{
itoa(i,buffer,2);
write(buffer);
}
i = get_key();
if (i != 0xff)
PORTC = ~(1<<i) & 0x7f;
else
PORTC = 0x7f;
}
return 0;
}
/*
* Initialisierung des µC
*/
void init(void)
{
DDRA = 0x00; /* Port als Eingang deklarieren ( A/D-Wandler Eingänge ) */
PORTA = 0x80;
DDRB = 0xff; /* Port als Ausgang deklarieren */
PORTB = 0x00;
DDRC = 0xff; /* Port als Ausgang deklarieren */
PORTC = 0x00;
DDRD = 0xff; /* Port als Ausgang deklarieren */
PORTD = 0x00;
/* Analog zu Digital Wandler aktivieren ( Prescaler = 128, interne +5V Referenz, "8-Bit" Ergebnis ) */
ADMUX = (1<<REFS0)|(1<<ADLAR);
ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
}
/**
* Fragt die Tasten an AD-Port 7 ab, kann nicht erkennen ob zwei Tasten gleichzeitig gedrückt werden
*
* 255 keine Taste gedrückt
0 Taste 1 gedrückt
1 Taste 2 gedrückt
2 Taste 3 gedrückt
3 Taste 4 gedrückt
4 Taste 5 gedrückt
*/
unsigned int get_key(void)
{
unsigned int i, taste = 0xff;
/* ADC7 mit Vcc als Referenzspannung */
ADMUX = (1<<REFS0)|(1<<ADLAR)|0x07;
/* AD Wandler starten */
ADCSRA |= (1<<ADSC);
/* Warten bis das Ergebniss zur Verfügung steht */
while(!(ADCSRA & (1<<ADIF)));
/* Ergebnis auslesen und anzeigen */
i = ADCH;
if (i < 36)
taste = 4;
else if (i < 57)
taste = 3;
else if (i < 76)
taste = 2;
else if (i < 94)
taste = 1;
else if (i < 150)
taste = 0;
return taste;
}
und noch der Code der Verantwortlich ist für die Ausgabe
#include <avr/io.h>
#include <string.h>
#include <inttypes.h>
void uart_init(void);
int uart_putc(unsigned char c)
{
while (!(UCSRA & (1<<UDRE))); /* warten bis Senden moeglich */
UDR = c; /* sende Zeichen */
return 0;
}
/* puts ist unabhaengig vom Controllertyp */
void uart_puts (char text[])
{
char *s;
s=&(text[0]);
while (*s)
{ /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
uart_putc(*s);
s++;
}
}
void write(char text[])
{
/*Den UART initialisieren*/
uart_init();
uart_puts(text);
}
void uart_init(void)
{
/* USART-Init 19200 Baud bei 16MHz für Mega32 */
UCSRB |= ( 1 << TXEN ); // UART TX einschalten
UCSRC |= ( 1 << URSEL )|( 3<<UCSZ0 ); // Asynchron 8N1
UBRRH = 0; // Highbyte ist 0
UBRRL = 51; // Lowbyte ist 51 ( dezimal )
}
Vielen Dank schon mal im voraus für eure Bemühungen
Gruss
Torsten