PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zum Dum oder wirklich falsch C Code mit winAVR



NumberFive
17.06.2004, 20:49
Hallo leute

bekomme diese programm nicht kompiliert
habe ich es nicht verstanden oder was ?



#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>


#define F_CPU 16000000 // 16 MHz
#define UART_BAUT_RATE 19200 // 19200 Baud

#define UART_BAUD_SELCT (F_CPU/(UART_BAUD_RATE*161)-1)

typedef unsigned char BYTE;
typedef unsigned short WORD;

BYTE GetKeyCode(void); //routine zum lesen der tasten auf dem board
void InitCom(void);
void SendText(void);
void SendBinary(void);

int main (void)
{
//hauptprg hier geht der controler immer als erstes hin


sbi(PORTA,PINA7);
//pull ub widerstand einschalten warum weiß ich auch noch nicht

//Analogport init
outp((1<<ADEN) & 7,ADCSR); // teiler auf 7 damit der bei 16 Mhz Tut

BYTE Taste;
for(;;)
{
//endlos schleife für das haupt prg sonst hällt das prg an
Taste = GetKeyCode();
if ( Taste != 0)
{
switch(Taste)
{
case 1:
SendText();
break;
case 2:
SendBinary();
break;
}
}

}


}

BYTE GetKeyCode(void)
{
return 0;
}

void SendText(void)
{

}
void SendBinary(void)
{

}

void InitCom(void)
{
//Init serial nur senden
outp((1 << TXEN), UCR);
// eingeschaltet
outp((BYTE) UART_BAUD_SELECT, UBRR);
// Baudrate ein gestellt
}



Augabe bei complier

main.c: In function `InitCom':
main.c:77: error: `UCR' undeclared (first use in this function)
main.c:77: error: (Each undeclared identifier is reported only once
main.c:77: error: for each function it appears in.)
main.c:79: error: `UBRR' undeclared (first use in this function)
main.c:79: error: `UART_BAUD_SELECT' undeclared (first use in this function)
make.exe: *** [main.o] Error 1

17.06.2004, 21:49
Hallo

Welche uC verwendest du denn ? Bei den neueren haben sich ein paar Registernamen geändert.

Bei UART_BAUD_SELECT fehlt oben bei dem define ein e.

MFG
Dieter

NumberFive
17.06.2004, 22:40
Hallo Dieter,

ich habe ein Mega16 ich glaube so langsam komme ich da hinter es gibt
wohl zwei winAVR programme kann das sein ?

der code den ich zur zeit tippe sieht ganz anders aus aber lässt sich compilieren oder wurde da so massiv was geändert ?

oupt( ) mag er auch nicht

17.06.2004, 22:45
Hallo

Schau mal in die Docu zu WINAVR. outp, sbi cbi und weitere fallen demnächst weg.

Auf Ports und Register kannst du jetzt direkt schreiben und lesen

PORTC = 0xff;
UDR = 'A';

usw.

Mfg
Dieter

NumberFive
17.06.2004, 23:16
jo seid 10 minuten weiß ich das auch nur jetzt passt mein tutoral nimmer kannd du mir eines emfehlen hier im forum proggen die meisten wohl mit BASCOM aber einglich finde ich c auch ganz nett und ich muß tags über nicht in einer anderen sprache denk wie abends.

wie heist den jetzt die funktion für sbi ?

gruß

18.06.2004, 08:38
Schau mal hier rein

http://www.mc-project.de/

Unter Programmierung sind viele Bitzugriffe erklärt.

MFG
Dieter

18.06.2004, 09:00
Tolle Seite ist das. Da ist vermutlich dieser Auszug für Dich interessant:



/************************************************** *********
Funktionsbibliothek für den USART des Atmega8
************************************************** *********/

#include <avr/io.h>

#define F_CPU 4000000
#define USART_BAUD_RATE 9600
#define USART_BAUD_SELECT (F_CPU/(USART_BAUD_RATE*16l)-1)

void USART_Init(void) {
UCSRB = _BV(RXCIE) | _BV(TXCIE) | _BV(RXEN) | _BV(TXEN);
UBRRL = (unsigned char) USART_BAUD_SELECT;
}

void USART_transmit (unsigned char c) {
while (!(UCSRA & (1<<UDRE))) {}
UDR = c;
}

unsigned char USART_receive (void) {
while(!(UCSRA & (1<<RXC))) {}
return UDR;
}

void USART_transmit_string (unsigned char *string) {
while (!(UCSRA & (1<<UDRE))) {}
while ( *string)
USART_transmit (*string++);
}

NumberFive
18.06.2004, 10:33
Hallo Dieter,

danke für die Seite werde sie mir gleich mal an sehen



/**************************************
mains.c
Autor: Numberfive
versuchen das ganze mal zu verstehen.
*************************************/

#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>


#define F_CPU 16000000 // 16 MHz
#define UART_BAUD_RATE 19200 // 19200 Baud

#define UART_BAUD_SELECT (F_CPU/(UART_BAUD_RATE*161)-1)

typedef unsigned char BYTE;
typedef unsigned short WORD;

BYTE GetKeyCode(void); //routine zum lesen der tasten auf dem board
void InitCom(void);
void SendText(void);
void SendBinary(void);

int main (void)
{
//hauptprg hier geht der controler immer als erstes hin
InitCom();

sbi(PORTA,PINA7);
//pull ub widerstand einschalten warum weiß ich auch noch nicht

//Analogport init
outp((1<<ADEN) & 7,ADCSR); // teiler auf 7 damit der bei 16 Mhz Tut

BYTE Taste;
for(;;)
{
//endlos schleife für das haupt prg sonst hällt das prg an
Taste = GetKeyCode();
if ( Taste != 0)
{
switch(Taste)
{
case 1:
SendText();
break;
case 2:
SendBinary();
break;
}
}

}


}

BYTE GetKeyCode(void)
{
WORD Result = 0;
BYTE Taste = 0;
//Init ADwandler
ADCSRA = (1<<ADEN)|(1<<ADSC)|(0<<ADATE)|(0<<ADIE)|(7<<ADPS2);
// wir messen Porta Pin 7
ADMUX = (1<<PINA7);
// was diese zeile bedeutet weiß ich nicht
sbi(ADCSRA,ADSC);
// warten bis messung abgesclossen ist und wert gültig
loop_until_bit_is_set(ADCSRA,ADSC);
// den wert aus dem register holen
Result = inw(ADCL);
// Wiederstands Netzwerk interpretieren
if (Result < 1010)
{
if(Result >= 410 && Result <= 450)
{
Taste = 1;
}
if(Result >= 340 && Result <= 380)
{
Taste = 2;
}
if(Result >= 265 && Result <= 305)
{
Taste = 3;
}
if(Result >= 180 && Result <= 220)
{
Taste = 4;
}
if(Result >= 100 && Result <= 130)
{
Taste = 5;
}
}
return Taste;
}

void SendText(void)
{

}
void SendBinary(void)
{

}

void InitCom(void)
{
/* Set baud rate */
UBRRH = (BYTE) (UART_BAUD_SELECT>>8);
UBRRL = (BYTE) UART_BAUD_SELECT;
/* Enable receiver and transmitter */
UCSRB = (1<<RXEN)|(1<<TXEN);
/* Set frame format: 8data, 1stop bit */
UCSRC = (1<<URSEL)|(0<<USBS)|(3<<UCSZ0);
}


so sieht es jetzt auch weiß du wie man eingänge im aver studio simuliert ?

Gruß und dank für deine mühe

pebisoft
16.08.2005, 18:57
#define UART_BAUT_RATE 19200 // 19200 Baud

#define UART_BAUD_SELCT (F_CPU/(UART_BAUD_RATE*161)-1)

soviele fachleute geben ratschläge. keiner hat gemerkt, das
"uart_baut_rate" einmal mit "t" geschrieben wurde und einmal mit "d".
mfg pebisoft

NumberFive
17.08.2005, 13:09
ich glaube pebisoft du hast dich verguckt.

aber egal die software läuft danke.

Zu mindestens im meinen Code fenster kann ich den schreib fehler nicht entdecken.

PicNick
17.08.2005, 14:07
@NumberFive
Wenn der Pebi recht hat, hat er recht
1. Post


#define F_CPU 16000000 // 16 MHz
#define UART_BAUT_RATE 19200 // 19200 Baud

#define UART_BAUD_SELCT (F_CPU/(UART_BAUD_RATE*161)-1)

typedef unsigned char BYTE;
typedef unsigned short WORD;

BYTE GetKeyCode(void); //routine


Wegen solchen Fehlern setzt man locker eine Nacht in den Sand, aber gut, was soll's

NumberFive
17.08.2005, 14:10
jetzt habe ich das auch gesehen im zweiten Code fenster ist der schreibfehler raus. Oben hatte ich nicht mehr geguckt gebe ich zu.

Gruß