Started implementing EEPROM writer/reader for AT28C256.

This commit is contained in:
2022-07-29 14:53:43 +02:00
parent ac69187b5f
commit 7a476f3180
8 changed files with 77 additions and 36 deletions

View File

@@ -20,7 +20,7 @@ const unsigned char A7 = 0x15;
void analog_read_duty_cycle(); void analog_read_duty_cycle();
unsigned char map_analog_pin(unsigned char); unsigned char map_analog_pin(unsigned char);
void pins_init(){ void pins_init() {
sei(); sei();
// enable ADC (128 bit ADPS scaling factor 0x07) to read analog values // enable ADC (128 bit ADPS scaling factor 0x07) to read analog values
@@ -37,7 +37,7 @@ void pins_init(){
TIMSK2 |= _BV(TOIE2); TIMSK2 |= _BV(TOIE2);
} }
void pin_mode(unsigned char pin, unsigned char mode){ void pin_mode(unsigned char pin, unsigned char mode) {
if(pin > A7){ if(pin > A7){
return; return;
} }
@@ -75,7 +75,7 @@ void pin_mode(unsigned char pin, unsigned char mode){
} }
} }
int digital_read(unsigned char pin){ int digital_read(unsigned char pin) {
if(pin > A7){ if(pin > A7){
return 0; return 0;
} }
@@ -94,7 +94,7 @@ int digital_read(unsigned char pin){
return analog_read(pin) > 512 ? 1 : 0; return analog_read(pin) > 512 ? 1 : 0;
} }
void digital_write(unsigned char pin, unsigned char value){ void digital_write(unsigned char pin, unsigned char value) {
if(pin > A7){ if(pin > A7){
return; return;
} }
@@ -132,7 +132,7 @@ void digital_write(unsigned char pin, unsigned char value){
} }
} }
unsigned int analog_read(unsigned char pin){ unsigned int analog_read(unsigned char pin) {
pin = map_analog_pin(pin); pin = map_analog_pin(pin);
if(pin > 7){ if(pin > 7){
@@ -151,7 +151,7 @@ unsigned int analog_read(unsigned char pin){
return ADC; return ADC;
} }
void analog_write(unsigned char pin, unsigned char value){ void analog_write(unsigned char pin, unsigned char value) {
// write digital if possible // write digital if possible
if(value == 0){ if(value == 0){
digital_write(pin, LOW); digital_write(pin, LOW);
@@ -206,7 +206,7 @@ void analog_write(unsigned char pin, unsigned char value){
} }
// maps A0-A7 to 0-7 // maps A0-A7 to 0-7
unsigned char map_analog_pin(unsigned char pin){ unsigned char map_analog_pin(unsigned char pin) {
if(pin > 7){ if(pin > 7){
return pin-A0; return pin-A0;
} }

View File

@@ -1,7 +1,7 @@
#include "serial.h" #include "serial.h"
#include <avr/io.h> #include <avr/io.h>
void serial_init(unsigned int baud){ void serial_init(unsigned int baud) {
unsigned long baud_prescale = ((16000000UL/(baud*16UL)))-1; unsigned long baud_prescale = ((16000000UL/(baud*16UL)))-1;
// enable transmitter and receiver // enable transmitter and receiver
@@ -15,7 +15,7 @@ void serial_init(unsigned int baud){
UBRR0L = baud_prescale; UBRR0L = baud_prescale;
} }
void serial_write(char* data, unsigned int n){ void serial_write(char* data, unsigned int n) {
unsigned int i; unsigned int i;
for(i = 0; i < n; i++){ for(i = 0; i < n; i++){
@@ -27,7 +27,7 @@ void serial_write(char* data, unsigned int n){
} }
} }
void serial_read(char* data, unsigned int n){ void serial_read(char* data, unsigned int n) {
unsigned int i; unsigned int i;
for(i = 0; i < n; i++){ for(i = 0; i < n; i++){

View File

@@ -1,5 +1,5 @@
#include "util.h" #include "util.h"
float map(float value, float fromLow, float fromHigh, float toLow, float toHigh){ float map(float value, float fromLow, float fromHigh, float toLow, float toHigh) {
return fromLow+((toHigh-toLow)/(fromHigh-fromLow))*(value-fromLow); return fromLow+((toHigh-toLow)/(fromHigh-fromLow))*(value-fromLow);
} }

34
at28c256/at28c256.c Normal file
View File

@@ -0,0 +1,34 @@
#include "at28c256.h"
#include "../ard/pins.h"
unsigned char _addrck, _addr;
void at28c256_init(unsigned char addrck, unsigned char addr) {
pin_mode(addrck, OUTPUT);
digital_write(addrck, LOW); // disable
pin_mode(addr, OUTPUT);
digital_write(addr, LOW); // disable
_addrck = addrck;
_addr = addr;
}
void at28c256_write(unsigned short addr, unsigned char data) {
// set the address
unsigned int i;
for(i = 0; i < 16; i++) {
if(addr & (1 << (15-i))) {
digital_write(_addr, HIGH);
} else {
digital_write(_addr, LOW);
}
digital_write(_addrck, HIGH);
digital_write(_addrck, LOW);
}
digital_write(_addr, LOW);
// TODO write data
}

8
at28c256/at28c256.h Normal file
View File

@@ -0,0 +1,8 @@
#ifndef AT28C256_H_
#define AT28C256_H_
void at28c256_init(unsigned char, unsigned char);
void at28c256_write(unsigned short, unsigned char);
//unsigned char at28c256_read(unsigned short); TODO
#endif

View File

@@ -15,6 +15,7 @@ rm -rf build || true
mkdir build mkdir build
# compile files # compile files
avr-gcc -Os -DF_CPU=16000000UL -mmcu=$MMCU -c -o build/at28c256.o -Wall at28c256/at28c256.c
avr-gcc -Os -DF_CPU=16000000UL -mmcu=$MMCU -c -o build/servo.o -Wall servo/servo.c avr-gcc -Os -DF_CPU=16000000UL -mmcu=$MMCU -c -o build/servo.o -Wall servo/servo.c
avr-gcc -Os -DF_CPU=16000000UL -mmcu=$MMCU -c -o build/rf24.o -Wall rf24/rf24.c avr-gcc -Os -DF_CPU=16000000UL -mmcu=$MMCU -c -o build/rf24.o -Wall rf24/rf24.c
avr-gcc -Os -DF_CPU=16000000UL -mmcu=$MMCU -c -o build/util.o -Wall ard/util.c avr-gcc -Os -DF_CPU=16000000UL -mmcu=$MMCU -c -o build/util.o -Wall ard/util.c

10
main.c
View File

@@ -2,7 +2,7 @@
#include <stdio.h> #include <stdio.h>
#include "ard/serial.h" #include "ard/serial.h"
#include "ard/pins.h" #include "ard/pins.h"
#include "ard/util.h" #include "at28c256/at28c256.h"
void prepare(); void prepare();
void loop(); void loop();
@@ -18,12 +18,12 @@ int main(){
void prepare(){ void prepare(){
pins_init(); pins_init();
serial_init(9600); serial_init(9600);
pin_mode(13, OUTPUT); at28c256_init(2, 13);
} }
void loop(){ void loop(){
digital_write(13, LOW); at28c256_write(0x0001, 0);
_delay_ms(1000);
at28c256_write(0x8000, 0);
_delay_ms(1000); _delay_ms(1000);
digital_write(13, HIGH);
_delay_us(1000000);
} }

View File

@@ -1,10 +1,8 @@
#include <util/delay.h>
#include "rf24.h" #include "rf24.h"
#include "nRF24L01.h" #include "nRF24L01.h"
#include "../ard/pins.h" #include "../ard/pins.h"
// FIXME for testing, remove later
#include <util/delay.h>
#define CONFIG_CRC (1<<EN_CRC)|(0<<CRCO) #define CONFIG_CRC (1<<EN_CRC)|(0<<CRCO)
unsigned char _ce, _csn, _sck, _mo, _mi, _irq, _payload_len; unsigned char _ce, _csn, _sck, _mo, _mi, _irq, _payload_len;
@@ -15,7 +13,7 @@ unsigned char rf24_fifo_empty();
void rf24_serial_transmit(unsigned char*, unsigned char); void rf24_serial_transmit(unsigned char*, unsigned char);
unsigned char rf24_serial_write(unsigned char); unsigned char rf24_serial_write(unsigned char);
void rf24_init(unsigned char ce, unsigned char csn, unsigned char sck, unsigned char mo, unsigned char mi, unsigned char irq){ void rf24_init(unsigned char ce, unsigned char csn, unsigned char sck, unsigned char mo, unsigned char mi, unsigned char irq) {
pin_mode(ce, OUTPUT); pin_mode(ce, OUTPUT);
digital_write(ce, LOW); // disable digital_write(ce, LOW); // disable
pin_mode(csn, OUTPUT); pin_mode(csn, OUTPUT);
@@ -34,7 +32,7 @@ void rf24_init(unsigned char ce, unsigned char csn, unsigned char sck, unsigned
} }
// channel in 1Mhz steps // channel in 1Mhz steps
void rf24_config(unsigned char channel, unsigned char payload_len){ void rf24_config(unsigned char channel, unsigned char payload_len) {
_payload_len = payload_len; _payload_len = payload_len;
rf24_config_register(RF_CH, channel&RF_CH_MASK); // 2.4Ghz + channel*1Mhz rf24_config_register(RF_CH, channel&RF_CH_MASK); // 2.4Ghz + channel*1Mhz
@@ -58,14 +56,14 @@ void rf24_config(unsigned char channel, unsigned char payload_len){
rf24_rx(); rf24_rx();
} }
void rf24_rx_addr(unsigned char* addr){ void rf24_rx_addr(unsigned char* addr) {
digital_write(_csn, LOW); digital_write(_csn, LOW);
rf24_serial_write(W_REGISTER|RX_ADDR_P1); // data pipe rf24_serial_write(W_REGISTER|RX_ADDR_P1); // data pipe
rf24_serial_transmit(addr, 5); rf24_serial_transmit(addr, 5);
digital_write(_csn, HIGH); digital_write(_csn, HIGH);
} }
void rf24_tx_addr(unsigned char* addr){ void rf24_tx_addr(unsigned char* addr) {
digital_write(_csn, LOW); digital_write(_csn, LOW);
rf24_serial_write(W_REGISTER|RX_ADDR_P0); // auto ACK pipe address must match... rf24_serial_write(W_REGISTER|RX_ADDR_P0); // auto ACK pipe address must match...
rf24_serial_transmit(addr, 5); rf24_serial_transmit(addr, 5);
@@ -76,7 +74,7 @@ void rf24_tx_addr(unsigned char* addr){
digital_write(_csn, HIGH); digital_write(_csn, HIGH);
} }
void rf24_rx(){ void rf24_rx() {
digital_write(_csn, LOW); digital_write(_csn, LOW);
rf24_serial_write(FLUSH_RX); rf24_serial_write(FLUSH_RX);
digital_write(_csn, HIGH); digital_write(_csn, HIGH);
@@ -88,17 +86,17 @@ void rf24_rx(){
digital_write(_ce, HIGH); digital_write(_ce, HIGH);
} }
void rf24_tx(){ void rf24_tx() {
rf24_config_register(STATUS, (1<<RX_DR)|(1<<TX_DS)|(1<<MAX_RT)); rf24_config_register(STATUS, (1<<RX_DR)|(1<<TX_DS)|(1<<MAX_RT));
rf24_config_register(CONFIG, CONFIG_CRC|(1<<PWR_UP)|(0<<PRIM_RX)); rf24_config_register(CONFIG, CONFIG_CRC|(1<<PWR_UP)|(0<<PRIM_RX));
} }
void rf24_power_down(){ void rf24_power_down() {
digital_write(_ce, LOW); digital_write(_ce, LOW);
rf24_config_register(CONFIG, CONFIG_CRC); rf24_config_register(CONFIG, CONFIG_CRC);
} }
void rf24_send(unsigned char* data){ void rf24_send(unsigned char* data) {
digital_write(_ce, LOW); digital_write(_ce, LOW);
rf24_tx(); rf24_tx();
digital_write(_csn, LOW); digital_write(_csn, LOW);
@@ -111,12 +109,12 @@ void rf24_send(unsigned char* data){
digital_write(_ce, HIGH); digital_write(_ce, HIGH);
} }
unsigned char rf24_is_sending(){ unsigned char rf24_is_sending() {
unsigned char status = rf24_status(); unsigned char status = rf24_status();
return !(status&((1<<TX_DS)|(1<<MAX_RT))); return !(status&((1<<TX_DS)|(1<<MAX_RT)));
} }
unsigned char rf24_data_ready(){ unsigned char rf24_data_ready() {
unsigned char status = rf24_status(); unsigned char status = rf24_status();
if(status&(1<<RX_DR)){ if(status&(1<<RX_DR)){
@@ -126,7 +124,7 @@ unsigned char rf24_data_ready(){
return !rf24_fifo_empty(); return !rf24_fifo_empty();
} }
void rf24_get_data(unsigned char* data){ void rf24_get_data(unsigned char* data) {
digital_write(_csn, LOW); digital_write(_csn, LOW);
rf24_serial_write(R_RX_PAYLOAD); rf24_serial_write(R_RX_PAYLOAD);
unsigned char i = 0; unsigned char i = 0;
@@ -139,21 +137,21 @@ void rf24_get_data(unsigned char* data){
rf24_config_register(STATUS, 1<<RX_DR); rf24_config_register(STATUS, 1<<RX_DR);
} }
unsigned char rf24_status(){ unsigned char rf24_status() {
digital_write(_csn, LOW); digital_write(_csn, LOW);
unsigned char status = rf24_serial_write(NOP); // returns STATUS register unsigned char status = rf24_serial_write(NOP); // returns STATUS register
digital_write(_csn, HIGH); digital_write(_csn, HIGH);
return status; return status;
} }
void rf24_config_register(unsigned char reg, unsigned char value){ void rf24_config_register(unsigned char reg, unsigned char value) {
digital_write(_csn, LOW); digital_write(_csn, LOW);
rf24_serial_write(W_REGISTER|(reg&REG_MASK)); rf24_serial_write(W_REGISTER|(reg&REG_MASK));
rf24_serial_write(value); rf24_serial_write(value);
digital_write(_csn, HIGH); digital_write(_csn, HIGH);
} }
unsigned char rf24_read_register(unsigned char reg){ unsigned char rf24_read_register(unsigned char reg) {
digital_write(_csn, LOW); digital_write(_csn, LOW);
rf24_serial_write(R_REGISTER|(reg&REG_MASK)); rf24_serial_write(R_REGISTER|(reg&REG_MASK));
unsigned char data = rf24_serial_write(NOP); unsigned char data = rf24_serial_write(NOP);
@@ -161,12 +159,12 @@ unsigned char rf24_read_register(unsigned char reg){
return data; return data;
} }
unsigned char rf24_fifo_empty(){ unsigned char rf24_fifo_empty() {
unsigned char fifo = rf24_read_register(FIFO_STATUS); unsigned char fifo = rf24_read_register(FIFO_STATUS);
return fifo&(1<<RX_EMPTY); return fifo&(1<<RX_EMPTY);
} }
void rf24_serial_transmit(unsigned char* data, unsigned char len){ void rf24_serial_transmit(unsigned char* data, unsigned char len) {
unsigned char i = 0; unsigned char i = 0;
for(i = 0; i < len; i++){ for(i = 0; i < len; i++){
@@ -174,7 +172,7 @@ void rf24_serial_transmit(unsigned char* data, unsigned char len){
} }
} }
unsigned char rf24_serial_write(unsigned char data){ unsigned char rf24_serial_write(unsigned char data) {
digital_write(_sck, LOW); // clock digital_write(_sck, LOW); // clock
unsigned char i = 0, rx = 0; unsigned char i = 0, rx = 0;