izaseba
11.11.2007, 11:48
Hallo,
Ich habe endlich meinen Asuro zum Leben erweckt und Ihm einen ISP Adapter spendiert (Bericht folgt heute noch).
Da ich mich zur Zeit mit der EEPROM Nutzung auf dem Asuro beschäftige,
würde mich interessieren, ob der Originale M8 den eeprom Inhalt nach erneutem Chip Erase behält oder nicht :-k
Da ich selber den Originalen M8 nicht mehr besitze, würde ich mich freuen, wenn einer von Euch mal mein(e) Programm(e) ausprobiert.
Programm 1:
#include<avr/io.h>
#include<avr/eeprom.h>
#include<avr/pgmspace.h>
#include<avr/interrupt.h>
#include<util/delay.h>
#include<string.h>
#include<stdlib.h>
#define BAUD 2400
#define BAUDSELECT (F_CPU/(BAUD*16L))-1
#define TRUE 1
#define FALSE 0
volatile uint8_t tastendruck = FALSE;
uint16_t tasten[6] EEMEM;
void init(void);
void push_flash(const char *);
void push_ram(char *);
static inline void push_char(char);
ISR (INT1_vect){
tastendruck = TRUE;
}
int main(void){
char stringpuffer[6];
uint16_t temp;
uint8_t tastennummer;
init();
PORTB |=(1<<PB0);
push_flash(PSTR("--= Asuro Tasten kalibrieren =--\r\n"));
for (tastennummer=1;tastennummer<7;tastennummer++) {
push_flash(PSTR("\r\nDruecke Taste "));
push_char((char)tastennummer+'0');
while(tastendruck == FALSE);
tastendruck = FALSE;
GICR = 0;
cli();
DDRD |=(1<<PD3);
PORTD |=(1<<PD3);
_delay_ms(10);
_delay_ms(10);
ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADSC)|(1<<ADIF);
while (!(ADCSRA & (1<<ADIF)));
temp = ADCW;
temp -= 5;//Testweise
PORTD &=~(1<<PD3);
DDRD &=~(1<<PD3);
_delay_ms(10);
GIFR = (1<<INTF1);
GICR = (1<<INT1);
sei();
itoa(temp,stringpuffer,10);
push_flash(PSTR("\r\nTastenwert "));
push_ram(stringpuffer);
eeprom_write_word(&tasten[tastennummer-1],temp);
}
push_flash(PSTR("\r\nTastenwerte wurden gespeichert\r\n"));
PORTB &=~(1<<PB0);
PORTD |=(1<<PD2);
while(1);
return 0;
}
void init(void) {
/*Statusled Init*/
DDRB |=(1<<PB0);
DDRD |=(1<<PD2);
/*Uart init*/
UBRRL = BAUDSELECT;
UCSRB = (1<<TXEN);
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
/*INT1 loest bei falling Edge aus*/
MCUCR = (1<<ISC11);
GICR = (1<<INT1);
/*ADC*/
ADCSRA=(1<<ADEN)|(1<<ADPS1)|(1<<ADPS2);
ADMUX = (1<<REFS0) | (1<<MUX2);
sei();
}
void push_flash(const char *string){
char zeichen;
while((zeichen = pgm_read_byte(string))) {
push_char(zeichen);
string++;
}
}
void push_ram(char *string){
char zeichen;
while ((zeichen=*string)){
push_char(zeichen);
string++;
}
}
static inline void push_char(char zeichen){
while(!(UCSRA&(1<<UDRE)));
UDR = zeichen;
}
Funktion:
Man wird aufgefordert alle Tasten nacheinander zu drücken, wichtig ist nur das man links anfängt, also Taste neben der IR-schnittstelle und sich dann nach rechts Richtung Schalter durchtastet.
Wenn das erledigt ist Flasht man Programm Nr. 2
#include<avr/io.h>
#include<avr/eeprom.h>
#include<avr/pgmspace.h>
#include<avr/interrupt.h>
#include<util/delay.h>
#include<string.h>
#include<stdlib.h>
#define BAUDSELECT (F_CPU/(BAUD*16L))-1
#define TRUE 1
#define FALSE 0
volatile uint8_t tastendruck = FALSE;
uint16_t tasten[6] EEMEM;
void init(void);
uint8_t taste_auswerten(uint16_t);
void push_flash(const char *);
void push_ram(char *);
static inline void push_char(char);
ISR (INT1_vect){
tastendruck = TRUE;
}
int main(void){
char stringpuffer[6];
uint16_t temp;
uint8_t a;
init();
push_flash(PSTR("--Asuro Tasten aus EEPROM auswerten--\r\n"));
while(1){
while(tastendruck == FALSE);
tastendruck = FALSE;
cli();
GICR = 0;
DDRD |=(1<<PD3);
PORTD |=(1<<PD3);
_delay_ms(10);
_delay_ms(10);
ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADSC)|(1<<ADIF);
while (!(ADCSRA & (1<<ADIF)));
temp = ADCW;
PORTD &=~(1<<PD3);
DDRD &=~(1<<PD3);
_delay_ms(10);
GIFR = (1<<INTF1);
GICR = (1<<INT1);
sei();
a=taste_auswerten(temp);
itoa(a,stringpuffer,10);
push_ram(stringpuffer);
push_flash(PSTR("\r\n"));
}
return 0;
}
void init(void) {
/*Uart init*/
UBRRL = BAUDSELECT;
UCSRB = (1<<TXEN);
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
/*INT1 loest bei falling Edge aus*/
MCUCR = (1<<ISC11);
GICR = (1<<INT1);
/*ADC*/
ADCSRA=(1<<ADEN)|(1<<ADPS1)|(1<<ADPS2);
ADMUX = (1<<REFS0) | (1<<MUX2);
sei();
}
uint8_t taste_auswerten(uint16_t adcwert){
uint8_t tastenwert = 1;
uint8_t a;
uint16_t eepromwert = eeprom_read_word(&tasten[0]);
if (adcwert < eepromwert)
return 0;
for (a=1;a<6;a++) {
eepromwert = eeprom_read_word(&tasten[a]);
if (adcwert < eepromwert)
return tastenwert;
else
tastenwert <<=1;
}
return tastenwert;
}
void push_flash(const char *string){
char zeichen;
while((zeichen = pgm_read_byte(string))) {
push_char(zeichen);
string++;
}
}
void push_ram(char *string){
char zeichen;
while ((zeichen=*string)){
push_char(zeichen);
string++;
}
}
static inline void push_char(char zeichen){
while(!(UCSRA&(1<<UDRE)));
UDR = zeichen;
}
Wenn man jetzt auf die Tasten drückt, und der Asuro sein eeprominhalt behält, sollte man je nach Taste Zweierpotenzen im Terminal angezeigt bekommen, also die gleiche Reihenfolge 1,2,4,8,16,32
Also, wer kann das bitte für mich testen ?
Danke Euch
Sebastian
Ich habe endlich meinen Asuro zum Leben erweckt und Ihm einen ISP Adapter spendiert (Bericht folgt heute noch).
Da ich mich zur Zeit mit der EEPROM Nutzung auf dem Asuro beschäftige,
würde mich interessieren, ob der Originale M8 den eeprom Inhalt nach erneutem Chip Erase behält oder nicht :-k
Da ich selber den Originalen M8 nicht mehr besitze, würde ich mich freuen, wenn einer von Euch mal mein(e) Programm(e) ausprobiert.
Programm 1:
#include<avr/io.h>
#include<avr/eeprom.h>
#include<avr/pgmspace.h>
#include<avr/interrupt.h>
#include<util/delay.h>
#include<string.h>
#include<stdlib.h>
#define BAUD 2400
#define BAUDSELECT (F_CPU/(BAUD*16L))-1
#define TRUE 1
#define FALSE 0
volatile uint8_t tastendruck = FALSE;
uint16_t tasten[6] EEMEM;
void init(void);
void push_flash(const char *);
void push_ram(char *);
static inline void push_char(char);
ISR (INT1_vect){
tastendruck = TRUE;
}
int main(void){
char stringpuffer[6];
uint16_t temp;
uint8_t tastennummer;
init();
PORTB |=(1<<PB0);
push_flash(PSTR("--= Asuro Tasten kalibrieren =--\r\n"));
for (tastennummer=1;tastennummer<7;tastennummer++) {
push_flash(PSTR("\r\nDruecke Taste "));
push_char((char)tastennummer+'0');
while(tastendruck == FALSE);
tastendruck = FALSE;
GICR = 0;
cli();
DDRD |=(1<<PD3);
PORTD |=(1<<PD3);
_delay_ms(10);
_delay_ms(10);
ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADSC)|(1<<ADIF);
while (!(ADCSRA & (1<<ADIF)));
temp = ADCW;
temp -= 5;//Testweise
PORTD &=~(1<<PD3);
DDRD &=~(1<<PD3);
_delay_ms(10);
GIFR = (1<<INTF1);
GICR = (1<<INT1);
sei();
itoa(temp,stringpuffer,10);
push_flash(PSTR("\r\nTastenwert "));
push_ram(stringpuffer);
eeprom_write_word(&tasten[tastennummer-1],temp);
}
push_flash(PSTR("\r\nTastenwerte wurden gespeichert\r\n"));
PORTB &=~(1<<PB0);
PORTD |=(1<<PD2);
while(1);
return 0;
}
void init(void) {
/*Statusled Init*/
DDRB |=(1<<PB0);
DDRD |=(1<<PD2);
/*Uart init*/
UBRRL = BAUDSELECT;
UCSRB = (1<<TXEN);
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
/*INT1 loest bei falling Edge aus*/
MCUCR = (1<<ISC11);
GICR = (1<<INT1);
/*ADC*/
ADCSRA=(1<<ADEN)|(1<<ADPS1)|(1<<ADPS2);
ADMUX = (1<<REFS0) | (1<<MUX2);
sei();
}
void push_flash(const char *string){
char zeichen;
while((zeichen = pgm_read_byte(string))) {
push_char(zeichen);
string++;
}
}
void push_ram(char *string){
char zeichen;
while ((zeichen=*string)){
push_char(zeichen);
string++;
}
}
static inline void push_char(char zeichen){
while(!(UCSRA&(1<<UDRE)));
UDR = zeichen;
}
Funktion:
Man wird aufgefordert alle Tasten nacheinander zu drücken, wichtig ist nur das man links anfängt, also Taste neben der IR-schnittstelle und sich dann nach rechts Richtung Schalter durchtastet.
Wenn das erledigt ist Flasht man Programm Nr. 2
#include<avr/io.h>
#include<avr/eeprom.h>
#include<avr/pgmspace.h>
#include<avr/interrupt.h>
#include<util/delay.h>
#include<string.h>
#include<stdlib.h>
#define BAUDSELECT (F_CPU/(BAUD*16L))-1
#define TRUE 1
#define FALSE 0
volatile uint8_t tastendruck = FALSE;
uint16_t tasten[6] EEMEM;
void init(void);
uint8_t taste_auswerten(uint16_t);
void push_flash(const char *);
void push_ram(char *);
static inline void push_char(char);
ISR (INT1_vect){
tastendruck = TRUE;
}
int main(void){
char stringpuffer[6];
uint16_t temp;
uint8_t a;
init();
push_flash(PSTR("--Asuro Tasten aus EEPROM auswerten--\r\n"));
while(1){
while(tastendruck == FALSE);
tastendruck = FALSE;
cli();
GICR = 0;
DDRD |=(1<<PD3);
PORTD |=(1<<PD3);
_delay_ms(10);
_delay_ms(10);
ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADSC)|(1<<ADIF);
while (!(ADCSRA & (1<<ADIF)));
temp = ADCW;
PORTD &=~(1<<PD3);
DDRD &=~(1<<PD3);
_delay_ms(10);
GIFR = (1<<INTF1);
GICR = (1<<INT1);
sei();
a=taste_auswerten(temp);
itoa(a,stringpuffer,10);
push_ram(stringpuffer);
push_flash(PSTR("\r\n"));
}
return 0;
}
void init(void) {
/*Uart init*/
UBRRL = BAUDSELECT;
UCSRB = (1<<TXEN);
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
/*INT1 loest bei falling Edge aus*/
MCUCR = (1<<ISC11);
GICR = (1<<INT1);
/*ADC*/
ADCSRA=(1<<ADEN)|(1<<ADPS1)|(1<<ADPS2);
ADMUX = (1<<REFS0) | (1<<MUX2);
sei();
}
uint8_t taste_auswerten(uint16_t adcwert){
uint8_t tastenwert = 1;
uint8_t a;
uint16_t eepromwert = eeprom_read_word(&tasten[0]);
if (adcwert < eepromwert)
return 0;
for (a=1;a<6;a++) {
eepromwert = eeprom_read_word(&tasten[a]);
if (adcwert < eepromwert)
return tastenwert;
else
tastenwert <<=1;
}
return tastenwert;
}
void push_flash(const char *string){
char zeichen;
while((zeichen = pgm_read_byte(string))) {
push_char(zeichen);
string++;
}
}
void push_ram(char *string){
char zeichen;
while ((zeichen=*string)){
push_char(zeichen);
string++;
}
}
static inline void push_char(char zeichen){
while(!(UCSRA&(1<<UDRE)));
UDR = zeichen;
}
Wenn man jetzt auf die Tasten drückt, und der Asuro sein eeprominhalt behält, sollte man je nach Taste Zweierpotenzen im Terminal angezeigt bekommen, also die gleiche Reihenfolge 1,2,4,8,16,32
Also, wer kann das bitte für mich testen ?
Danke Euch
Sebastian