dein Beispiel
char bCH = 65;
char bStr[] = { 1,2,bCH, 78};
geht bei mir nicht. gleiche Fehlermeldung wie oben.
Hast du das mit winavr getestet?
gruß ceekay
Druckbare Version
dein Beispiel
char bCH = 65;
char bStr[] = { 1,2,bCH, 78};
geht bei mir nicht. gleiche Fehlermeldung wie oben.
Hast du das mit winavr getestet?
gruß ceekay
oje, das liegt am Compiler, er will einen konstanten wert haben. naja.
Alternative:
char bCH = 65;
char bStr[] = { 1,2, 0 , 78}; // nur platzhalten
bStr[2] = bCH; // jetzt muß er aber können
bei vielen Werten ist das natürlich mühsam
leider
nein sind nicht viele Werte ist nur ein Integer den ich in 2 char aufteile. Der Rest sind Konstanten.
Dann will ichs mal testen.
gruß ceekay
Achso, kannst du mir noch den Unterschied zwischen:
char bStr[] = {irgentwas};
und
prog_char daten[] = {irgentwas};
erklären ?
gruß ceekay
Also ich hab jetzt folgendes:
char pwm_wert_motor_fuer_uebertragung_low;
char pwm_wert_motor_fuer_uebertragung_high;
char daten[14] = {2,66,0,0,0,0,0,0,0,1,0,0,3,4,23};
und dann schreibe ich in der main();
{
daten[10] = pwm_wert_motor_fuer_uebertragung_high;
daten[11] = pwm_wert_motor_fuer_uebertragung_low;
}
wie kann ich diesen String jetzt wieder auslesen?
p_string = daten;
UDR = pgm_read_byte( p_string++ );
gruß ceekay
ok jetzt funktioniert alles.
Ich hätte mich vorher erstmal mit zeiger und arrays auseinandersetzen.
da das arry ja jetzt nicht mehr im flash steht funktionierte natürlich "pgm_read_byte" nicht mehr
Vielen Dank für eure Hilfe
gruß ceekay
hab kijons code genommen:
bekomme dann aber beim kompilieren immer folgende fehlermeldung:Code:#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/pgmspace.h>
#define SYSCLK 7372800
#define BAUD 9600UL
#define UBRR_BAUD ((SYSCLK/(16*BAUD))-1)
#define TRUE 1
#define FALSE 0
// USART initialisieren
void uart_init(void);
volatile unsigned char daten_gesendet = TRUE;
const prog_char* volatile p_string;
// Zeichenkette im Flashspeicher
prog_char daten[] = "Hello World!\n";
int main(void)
{
// USART initialisieren
uart_init();
sei();
while (1)
{
if (daten_gesendet)
{
// Flag zurücksetzen
daten_gesendet = FALSE;
// Pointer zeigt auf die Daten im Flashspeicher
p_string = daten;
/* Interrupt aktivieren, damit wird sofort zur
Interruptroutine gesprungen und das erste Zeichen gesendet. */
UCSRB |= (1<<UDRIE);
}
}
}
void uart_init(void)
{
// Baudrate einstellen ( Normaler Modus )
UBRRH = (unsigned char) (UBRR_BAUD>>8);
UBRRL = (unsigned char) (UBRR_BAUD & 0x00FF);
// Aktivieren des Empfängers, des Senders und des "Daten empfangen"-Interrupts
UCSRB = (1<<RXEN)|(1<<TXEN);
// Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}
/* Interrupt wird ausgelöst sobald der Sendepuffer leer ist */
SIGNAL(SIG_UART_DATA)
{
char buffer = pgm_read_byte(p_string++);
/* Wenn nicht das Ende der Zeichenkette erreicht wurde,
dann weiteres Zeichen senden */
if ( buffer != '\0' ) {
UDR = buffer;
} else {
// Flag setzen, das der String gesendet wurde
daten_gesendet = TRUE;
// Interrupt deaktivieren
UCSRB &= ~(1<<UDRIE);
}
}
Woran liegt das jetzt, das erste Beispiel bei dem ich auf ein Regsiter zugefriffen hab ging noch?Code:Z:\AVRDevel\Test>make
-------- begin --------
avr-gcc (GCC) 3.4.3
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Compiling: Test.c
avr-gcc -c -mmcu=atmega162 -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char
-funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-
adhlns=Test.lst -std=gnu99 -MD -MP -MF .dep/Test.o.d Test.c -o Test.o
Test.c: In function `main':
Test.c:41: error: `UCSRB' undeclared (first use in this function)
Test.c:41: error: (Each undeclared identifier is reported only once
Test.c:41: error: for each function it appears in.)
Test.c:41: error: `UDRIE' undeclared (first use in this function)
Test.c: In function `uart_init':
Test.c:49: error: `UBRRH' undeclared (first use in this function)
Test.c:50: error: `UBRRL' undeclared (first use in this function)
Test.c:53: error: `UCSRB' undeclared (first use in this function)
Test.c:53: error: `RXEN' undeclared (first use in this function)
Test.c:53: error: `TXEN' undeclared (first use in this function)
Test.c:56: error: `UCSRC' undeclared (first use in this function)
Test.c:56: error: `URSEL' undeclared (first use in this function)
Test.c:56: error: `UCSZ1' undeclared (first use in this function)
Test.c:56: error: `UCSZ0' undeclared (first use in this function)
Test.c: At top level:
Test.c:60: warning: `SIG_UART_DATA' appears to be a misspelled signal handler
Test.c: In function `SIG_UART_DATA':
Test.c:67: error: `UDR' undeclared (first use in this function)
Test.c:74: error: `UCSRB' undeclared (first use in this function)
Test.c:74: error: `UDRIE' undeclared (first use in this function)
make: *** [Test.o] Error 1
das Makefile hab ich übrigens mit MFile erstellt.
hy bist du sicher das du beim erstellen der makefile auch deinen Controller angegeben hast?
jo, hab den atmega162 wie man ja in der Ausgabe auch sieht...ich verstehs nicht, grrrr
hmm ich tippe trotzdem auf die makefile. da er die ganzen registerbezeichnungen nicht kennt.