Finished serial functions.

This commit is contained in:
Marvin Blum
2017-03-21 16:50:13 +01:00
parent 48cf07de97
commit 7fdf8c1dc1
6 changed files with 60 additions and 27 deletions

View File

@@ -1,9 +1,10 @@
#!/bin/bash
mkdir build
avr-gcc -Os -DF_CPU=16000000UL -mmcu=atmega328p -c -o build/serial.o -Wall serial.c
avr-gcc -Os -DF_CPU=16000000UL -mmcu=atmega328p -c -o build/pins.o -Wall pins.c
avr-gcc -Os -DF_CPU=16000000UL -mmcu=atmega328p -c -o build/main.o -Wall main.c
avr-gcc -mmcu=atmega328p build/main.o build/pins.o -o build/main
avr-gcc -mmcu=atmega328p build/*.o -o build/main
avr-objcopy -O ihex -R .eeprom build/main build/main.hex
avrdude -F -V -c arduino -p ATMEGA328P -P $1 -b 57600 -U flash:w:build/main.hex
rm -r build

33
main.c
View File

@@ -1,22 +1,16 @@
#include <avr/io.h>
#include <util/delay.h>
#include "serial.h"
#include "pins.h"
#define USART_BAUDRATE 9600
#define BAUD_PRESCALE (((16000000UL/(USART_BAUDRATE*16UL)))-1)
void loop();
int main(){
digitalPinMode(6, INPUT);
/*digitalPinMode(6, INPUT);
digitalPinMode(7, INPUT);
digitalPinMode(12, OUTPUT);
digitalPinMode(12, OUTPUT);*/
// TODO verstehen und dann in Funktion packen
UCSR0B |= (1<<RXEN0)|(1<<TXEN0);
UCSR0C |= (1<<UCSZ00)|(1<<UCSZ01);
UBRR0H = BAUD_PRESCALE>>8;
UBRR0L = BAUD_PRESCALE;
serial_init(9600);
while(1){
loop();
@@ -31,20 +25,9 @@ void loop(){
digitalWrite(12, LOW);
}*/
// TODO verstehen und dann in Funktion packen
while(!(UCSR0A&(1<<UDRE0)));
UDR0 = 'h';
while(!(UCSR0A&(1<<UDRE0)));
UDR0 = 'e';
while(!(UCSR0A&(1<<UDRE0)));
UDR0 = 'l';
while(!(UCSR0A&(1<<UDRE0)));
UDR0 = 'l';
while(!(UCSR0A&(1<<UDRE0)));
UDR0 = 'o';
while(!(UCSR0A&(1<<UDRE0)));
UDR0 = '\n';
// while(!(SPSR&(1<<SPIF)));
char buffer[5];
serial_read(buffer, 5);
serial_write(buffer, 5);
_delay_ms(1000);
_delay_ms(100);
}

2
pins.c
View File

@@ -116,4 +116,4 @@ void analogWrite(unsigned char pin, unsigned char value){
else{
PORTC &= ~_BV(DDC0+pin);
}
}
}

1
pins.h
View File

@@ -6,6 +6,7 @@ extern const unsigned char HIGH;
extern const unsigned char INPUT;
extern const unsigned char OUTPUT;
// rename underscore
void digitalPinMode(unsigned char, unsigned char);
int digitalRead(unsigned char);
void digitalWrite(unsigned char, unsigned char);

40
serial.c Normal file
View File

@@ -0,0 +1,40 @@
#include "serial.h"
#include <avr/io.h>
void serial_init(unsigned int baud){
unsigned long baud_prescale = ((16000000UL/(baud*16UL)))-1;
// enable transmitter and receiver
UCSR0B |= (1<<RXEN0)|(1<<TXEN0);
// set frame format (8 data bits, 2 stop bits)
UCSR0C |= (1<<UCSZ00)|(1<<UCSZ01);
// set baudrate (16 bit)
UBRR0H = baud_prescale>>8;
UBRR0L = baud_prescale;
}
void serial_write(char* data, unsigned int n){
unsigned int i;
for(i = 0; i < n; i++){
// wait for empty tx buffer
while(!(UCSR0A&(1<<UDRE0)));
// write to tx register
UDR0 = data[i];
}
}
void serial_read(char* data, unsigned int n){
unsigned int i;
for(i = 0; i < n; i++){
// wait until data is available in rx buffer
while(!(UCSR0A&(1<<RXC0)));
// store in data array
data[i] = UDR0;
}
}

8
serial.h Normal file
View File

@@ -0,0 +1,8 @@
#ifndef SERIAL_H_
#define SERIAL_H_
void serial_init(unsigned int);
void serial_write(char*, unsigned int);
void serial_read(char*, unsigned int);
#endif