Próbuje uruchomić przetwornik A/C w tym procesorze i jakoś nie bardzo mi wychodzi. Chciałem zrobić żeby wartość zczytana z potencjometru była wysyłana na wyświetlacz. Wyświetlanie zmiennych i tekstu zdefiniowanych w programie chodzi, tylko czytanie przretwornika mi nie wychodzi:
Mam dwa pliki nagłowkowe:
1. lcd.h:
2. adc.h:
No i wkońcu część głowna:
Co tu moze być źle? Jakby znalazł się ktoś kto by wprowadził poprawki to by było miło
Próbowałem coś napisać na podstawie tematów znalezionych w archiwum, ale coś mi nie wychodzi.
Mam dwa pliki nagłowkowe:
1. lcd.h:
#define LCD_H
#include <avr/io.h>
//
#define LCD PORTD
#define E 1
#define RS 0
//
#define SET_E LCD |= _BV(E)
#define CLR_E LCD &= ~_BV(E)
//
#define SET_RS LCD |= _BV(RS)
#define CLR_RS LCD &= ~_BV(RS)
// funkcja opóźniająca o x*1ms
void waitms(char x)
{
unsigned char a, b; // zmnienne licznikowe
for( ; x > 0; --x) // ta pętla zostanie wykonana x-razy
for(b = 10; b > 0; --b) // a ta 10 razy
for(a = 100; a > 0; --a) // natomiast ta 100 razy
__asm("nop"); // dodatkowa instrukcja opóźniająca o 1 cykl
// razem to da opóźnienie ok. x * 1ms
// x od 0 do 255
}
// pcodedura zapisu bajtu do wyświetlacza LCD
// bez rozróżnienia instrukcja/dana
void write_to_lcd(char x)
{
SET_E; // ustaw na E stan wysoki
LCD = ((LCD & 0x0F) | (x & 0xF0)); // zapis pierwszej połówki bajtu
CLR_E; // opadające zbocze na E -> zapis do wyświetlacza
SET_E; // ustaw na E stan wysoki
LCD = ((LCD & 0x0F) | ((x & 0x0F) << 4)); // zapis drugiej połowki bajtu
CLR_E; // opadające zbocze na E -> zapis do wyświetlacza
waitms(1); // czekaj 1ms
}
// procedura zapisu instrukcji do wyświetlacza LCD
void write_command(char x)
{
CLR_RS; // niski stan na RS -> zapis instrukcji
write_to_lcd(x); // zapis do LCD
}
// procedura zapisu danej do wyświetlacza LCD
void write_char(char x)
{
SET_RS; // wysoki stan na RS -> zapis danej
write_to_lcd(x); // zapis do LCD
}
// procedura zapisu tekstu do wyświetlacza LCD
void write_text(char * s)
{
while(*s) // do napotkania 0
{
write_char(*s); // zapisz znak wskazywany przez s na LCD
s++; // zwiększ s (przygotuj nastepny znak)
}
}
void lowerline(void)
{
write_command(0xA8);
}
// procedura inicjalizacji wyświetlacza LCD
void lcd_init(void)
{
waitms(15); // czekaj 15ms na ustabilizowanie się napięcia zasilającego
CLR_E; // E = 0
CLR_RS; // RS = 0
char i; // zmianna licznikowa
for(i = 0; i < 3; i++) // trzykrotne powtórzenie bloku instrukcji
{
SET_E; // E = 1
LCD &= 0x3F; //
CLR_E; // E = 0
waitms(5); // czekaj 5ms
}
SET_E; // E = 1
LCD &= 0x2E; //
CLR_E; // E = 0
waitms(1); // czekaj 1ms
write_command(0x28); // interfejs 4-bity, 2-linie, znak 5x7
write_command(0x08); // wyłącz LCD, kursor i miganie
write_command(0x01); // czyść LCD
write_command(0x06); // bez przesuwania w prawo
write_command(0x0C); // włącz LCD, bez kursora i mrugania
}2. adc.h:
void InitADC(void)
{
ADMUX = (1<<REFS1) | (1<<REFS0);
// wewnętrzne Vref = 2,56V i ustawiony kanał 0
ADCSRA = (1<<ADEN) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
// ADC włączony, przerwanie włączone, preskaler = 64
}
void StartADC(void)
{
ADCSRA |= (1<<ADSC);
}No i wkońcu część głowna:
#include <avr/io.h>
#include "lcd.h"
#include "adc.h"
unsigned int pomiar;
int main(void)
{
DDRD=0xFF;
DDRC=0XFE;
PORTD=0xFF;
lcd_init();
write_char(pomiar);
while(1);
{
//inicjalizacja ADC
InitADC();
StartADC();
pomiar=ADCL>>6;
pomiar|=2<<ADCH;
}
return 0;
} Co tu moze być źle? Jakby znalazł się ktoś kto by wprowadził poprawki to by było miło
Próbowałem coś napisać na podstawie tematów znalezionych w archiwum, ale coś mi nie wychodzi.