hi wkrug
ich benutze AVR-Studio 4 und ich habe insgesamt nur ein warning und das bezieht sich auf eine funktion in der delay.h (die warnung erscheint aber bei all meinen programmen und ist zu vernachlässigen)
bei pow gehören laut c-buch normale klammern hin pow()
der PIND2 ist gleichzeitig der pin für den externen interrupt (von dem ich 2 stück habe PinD 2 und PinD3 und beide sind belegt einmal mit NIRQ und einmal mit DCLK)
ich habe in meinem gesamtprogramm auch noch andere funktionen drin (LCDansteuerung und RS232 übertragung) und ohne das neue rfm12.c funktionieren die auch ich kann ja mal alles hier reinstellen. im grunde will ich am ende per hyperterminal einen buchstaben eingeben und den dann von einem evalutations board zu anderen schicken und auf dem 2ten board in der lcd anzeige ausgeben.
also
die main.c
Code:
#ifndef F_CPU
#define F_CPU 4000000L
#endif
#define SPI PINB
#define MISO PINB6
#include <avr/io.h>
#include <avr/iom16.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#include <math.h>
#include "LCD-8bit.h"
#include "RS232.h"
#include "RFM12.h"
//Eigenschaften festelgen;
volatile char rs232_empf_zeichen;
volatile int rs232_empf_gesetzt = 0;
volatile char rs232_send_zeichen;
volatile int rs232_send_gesetzt = 0;
volatile char rfm12_empf_zeichen;
volatile int rfm12_empf_gesetzt = 0;
volatile char rfm12_send_zeichen;
volatile int rfm12_send_gesetzt = 0;
volatile char lcd8bit_zeichen;
volatile int abfangarray[16];
volatile int x = 0;
ISR(INT0_vect)
{
PORTC |= (1<<PC1);
abfangarray[x] = (SPI & (1<<MISO));
if(x<15)
x=x+1;
else
{
x=0;
int y;
rfm12_empf_zeichen=0;
for(y=0;y<=15;y=y+1)
{
if(abfangarray[y]==1)
{
rfm12_empf_zeichen = rfm12_empf_zeichen + pow(2,y);
}
}
rfm12_empf_gesetzt = 1;
}
}
ISR(USART_RXC_vect)
{
while(!(UCSRA & (1<<RXC))) // warten bis Zeichen verfuegbar
{
}
PORTC |= (1<<PC0);
rs232_empf_zeichen = UDR; // Zeichen aus UDR lesen
rs232_empf_gesetzt = 1;
}
int main(void)
{
DDRC |= (1<<PC0)|(1<<PC1);
sei();
init_8bitlcd();
init_uart();
init_rfm12();
while(1)
{
if(rs232_empf_gesetzt == 1)
{
daten_schreiben(rs232_empf_zeichen);
rs232_empf_gesetzt = 0;
rfm12_send_gesetzt = 1;
}
else
{
PORTC &= ~(1<<PC0);
}
if(rfm12_empf_gesetzt == 1)
{
daten_schreiben(rfm12_empf_zeichen);
rfm12_empf_gesetzt = 0;
rs232_send_gesetzt = 1;
}
else
{
PORTC &= ~(1<<PC1);
}
if(rs232_send_gesetzt == 1)
{
rs232_send_zeichen = rfm12_empf_zeichen;
senden_mit_rs232(rs232_send_zeichen);
senden_mit_rs232('5'-40);
senden_mit_rs232(rs232_send_zeichen);
rs232_send_gesetzt = 0;
}
if(rfm12_send_gesetzt == 1)
{
PORTC |= (1<<PC2);
rfm12_send_zeichen = rs232_empf_zeichen;
senden_mit_rfm12(rfm12_send_zeichen);
senden_mit_rfm12('5'-40);
senden_mit_rfm12(rfm12_send_zeichen+40);
rfm12_send_gesetzt = 0;
PORTC &= ~(1<<PC2);
}
}
return 0;
}
dann die rfm12.c
Code:
#ifndef F_CPU
#define F_CPU 4000000L //Controllerfrequenz für die util/delay.h
#endif
#include <avr/io.h>
#include <avr/iom16.h>
#include <util/delay.h>
#include <inttypes.h>
#include <math.h>
#include "RFM12.h"
#define SCK PB7
#define MOSI PB5
#define SS PB4
#ifndef SPI
#define SPI PINB
#endif
#ifndef MISO
#define MISO PINB6
#endif
#define DCLK PIND3
#define nIRQ PIND2
void senden_mit_rfm12(int wert)
{
int werte_array[16];
int pruefung = wert;
int i = 0;
for(i = 0; i<=15; i=i+1)
{
pruefung=pruefung - pow(2,i);
if (pruefung >=0)
{
werte_array[i]=1;
}
else
{
pruefung=pruefung + pow(2,i);
werte_array[i]=0;
}
}
while(!(PIND & (1<<nIRQ)))
{
}
int j = 0;
for(j = 0; j<=15; j=j+1)
{
if(werte_array[j] == 1);
{
PORTB |= (1<<MOSI);
}
if(werte_array[j] == 0);
{
PORTB &= ~(1<<MOSI);
}
PORTB |= (1<<SCK);
_delay_ms(1);
PORTB &= ~(1<<SCK);
}
}
void register_setzen_an_rfm12(int wert)
{
PORTB |= (1<<SS);
senden_mit_rfm12(wert);
PORTB &= ~(1<<SS);
}
void init_rfm12(void)
{
DDRB |= (1<<SCK)|(1<<MOSI)|(1<<SS);
PORTB = 0;
register_setzen_an_rfm12(0x80D7); //433Mhz
register_setzen_an_rfm12(0x82B9); //enable transmitter enable synthesizer enable crystal oszilator disable CLK-PIN
register_setzen_an_rfm12(0xA4B0); //433Mhz
register_setzen_an_rfm12(0xC6BD); //9600Baud
}
nun die lcd-8bit.c
Code:
#ifndef F_CPU
#define F_CPU 4000000L //Controllerfrequenz für die util/delay.h
#endif
//------------------------------------//------------------------------------
//Ausgänge festlegen:
#define datenposition DDRA
#define datenwerte PORTA
#define D0 PA0
#define D1 PA1
#define D2 PA2
#define D3 PA3
#define D4 PA4
#define D5 PA5
#define D6 PA6
#define D7 PA7
#define steuerungsposition DDRB
#define steuerwerte PORTB
#define E PB0
#define R_W PB1
#define RS PB2
//------------------------------------
#include <avr/io.h>
#include <avr/iom16.h>
#include <util/delay.h>
#include <inttypes.h>
#include "LCD-8bit.h"
volatile int zaehler = 0;
//------------------------------------
int _D = 1; //Display an(1)/aus(0)
int _C = 0; //Cursor an(1)/aus(0)
int _B = 0; //Cursor blinken an(1)/aus(0)
int _N = 1; //zweizeiliges(1)/einzeiliges(0) Display
int _F = 0; //5x10-Font(1)/5x7-Font(0)
int _BF = 0; //ist beschäftigt(1)/Kann Kommandos annehmen(0)
int LCD_stellen = 16; //anzahl der möglichen Zeichen pro zeile
//------------------------------------
void enable(void)
{
steuerwerte |= (1<<E);
_delay_ms(1);// kurze pause
steuerwerte &= ~(1<<E);
_delay_ms(1);// kurze pause
}
void init_8bitlcd(void)
{
datenposition = 0xFF;
datenwerte = 0x00;
steuerungsposition = (1<<E)|(1<<R_W)|(1<<RS);
steuerwerte = 0x00;
_delay_ms(16);
funktionen(1,0,0);
_delay_ms(5);
funktionen(1,0,0);
_delay_ms(1);
funktionen(1,0,0);
modus(1,0);
display_und_cursor_optionen(1,0,0);
bild_loeschen();
cursor_auf_startpos();
}
void bild_loeschen(void)
{
steuerwerte &= ~((1<<RS)|(1<<R_W));
datenwerte = 0;
datenwerte |= (1<<D0);
enable();
}
void cursor_auf_startpos(void)
{
steuerwerte &= ~((1<<RS)|(1<<R_W));
datenwerte = 0x00;
datenwerte |= (1<<D1);
enable();
zaehler = 0;
}
// I_D => Curserposition Inkrement(1)/dekrement(0) (schreibrichtung festlegen)
// S => Displayinhalt fest(1)/weiterschieben(0)
void modus(int I_D, int S)
{
steuerwerte &= ~((1<<RS)|(1<<R_W));
datenwerte = 0x00;
datenwerte |= (1<<D2);
if(I_D==1)
datenwerte |= (1<<D1);
if(S==1)
datenwerte |= (1<<D0);
enable();
}
// D => Display an(1)/aus(0)
// C => Cursor an(1)/aus(0)
// B => Cursor blinken an(1)/aus(0)
void display_und_cursor_optionen(int D, int C, int B)
{
steuerwerte &= ~((1<<RS)|(1<<R_W));
datenwerte = 0x00;
datenwerte |= (1<<D3);
if(D==1)
datenwerte |= (1<<D2);
if(C==1)
datenwerte |= (1<<D1);
if(B==1)
datenwerte |= (1<<D0);
enable();
}
// S_C => Displayinhalt schieben(1)/Cursor bewegen(0)
// R_L => S_C nach rechts(1)/nach links(0) schieben
void cursor_oder_display_schieben(int S_C, int R_L)
{
steuerwerte &= ~((1<<RS)|(1<<R_W));
datenwerte = 0x00;
datenwerte |= (1<<D4);
if(S_C==1)
datenwerte |= (1<<D3);
if(R_L==1)
datenwerte |= (1<<D2);
enable();
}
// DL => 8bit-Interface(1)/4bit-Interface(0)
// N => zweizeilig(1)/einzeilig(0)
// F => 5x10-Font(1)/5x7-Font(0)
void funktionen(int DL, int N, int F)
{
steuerwerte &= ~((1<<RS)|(1<<R_W));
datenwerte = 0x00;
datenwerte |= (1<<D5);
if(DL==1)
datenwerte |= (1<<D4);
if(N==1)
datenwerte |= (1<<D3);
if(F==1)
datenwerte |= (1<<D2);
enable();
}
//adresse => CGRAM-Adresse (6stellig)
void CGRAM(int adresse)
{
steuerwerte &= ~((1<<RS)|(1<<R_W));
datenwerte = 0x00;
datenwerte |= (1<<D6);
enable();
}
//adresse => DDRAM-Adresse (7stellig)
void DDRAM(int adresse)
{
steuerwerte &= ~((1<<RS)|(1<<R_W));
datenwerte = 0x00;
datenwerte |= (1<<D7);
enable();
}
//adresse => CG-/DDRAM-Adresse (7stellig)
//BF => ist beschäftigt(1)/Kann Kommandos annehmen(0)
void adresse_oder_status_lesen(int adresse, int BF)
{
steuerwerte |= (1<<R_W);
steuerwerte &= ~(1<<RS);
datenwerte = 0x00;
datenwerte = adresse;
if(BF==1)
datenwerte |= (1<<D7);
enable();
}
//zeichen => Dezimalzahl des zu schreibenden Zeichens nach ASCII-Tabelle
void daten_schreiben(int zeichen)
{
if(zaehler<=(LCD_stellen - 1))
zaehler = zaehler + 1;
if(zaehler==LCD_stellen)
cursor_oder_display_schieben(1,0);
steuerwerte |= (1<<RS);
steuerwerte &= ~(1<<R_W);
datenwerte = 0x00;
datenwerte = zeichen;
enable();
}
// *text => Zeiger auf ein char array mit den anzugeigenden Zeichen (länge egal)
// LCD_stellen => hier angeben wie viele Zweichen pro zeile auf dem Display angezeigt werden können
void text_schreiben(char *text)
{
while(*text)
{
daten_schreiben(*text);
text++;
}
}
und als letztes die rs232.c
Code:
#ifndef F_CPU
#define F_CPU 4000000L //Controllerfrequenz für die util/delay.h
#endif
#ifndef Baudrate
#define Baudrate 9600L
#endif
#include <avr/io.h>
#include <avr/iom16.h>
#include <util/delay.h>
#include <inttypes.h>
#include "RS232.h"
void senden_mit_rs232(char x)
{
while (!(UCSRA & (1<<UDRE))) // warten bis Senden moeglich
{
}
UDR = x; // schreibt das Zeichen x auf die Schnittstelle
}
void init_uart(void)
{
UCSRB =0;
// Definition zum senden + Interupt wenn gesendet wurde + interupt wenn sendeplatz wieder frei
UCSRB |= (1<<TXEN);
UCSRC |= (1<<URSEL)|(3<<UCSZ0); //Asynchron 8N1
// Definition zum empfangen + Interupt wenn signal empfangen wird
UCSRB |= (1<<RXEN)|(1<<RXCIE);
//Definition für 9bit übertragung mit paritätsbit (optional)
//UCSRB |= (1<<CHR9)
//UCSRB|=(1<<RXB8) stellt das 9. empfangsbit dar
//UCSRB|=(1<<TXB8) stellt das 9. sendebit dar
//Definierung der Übertragungsgeschwindigkeit
int UBRR_VAL = (F_CPU/(Baudrate*16))-1;
UBRRH = UBRR_VAL >> 8;
UBRRL = UBRR_VAL & 0xFF;
}
die dazugehörigen .h dateien müssten noch ebend nacherzeugt werden
da ich ja leider von einem interrupt schlecht ein return zurück bekommen kann stehen diese in der main statt ihrer passenden unterdatei und beziehen sich auf globale variablen.
der fehler liegt sicherlich bei meiner rfm12.c nur weiß ich nicht wo.
wenn ich den code auf meinen controller überspiele und teste kann ich beim hyperterminal eingeben was ich will es passier NIX außer das die RS232 übertragungs LED leuchtet.
Lesezeichen