A gdybyś zmiast:
#include <HD44780.c>
Wpisał:
#include "HD44780.h"
A HD44780.c dodał do programu w Source Files to byłoby dużo lepiej.
Add Existing Source File(s).
Dołączanie przez #include plików z rozrzeżeniem .c jest paskudnym pomysłem.
Miotanie się od ściany do ściany w pewnym wieku nie przystoi.
Cierpliwości.
Program się powoli pisze- może trochę inny niż Twój.
Ale zaczyna działać.
Jestem tak samo głupi w C jak Ty- ale bardziej cierpliwy.
Tu wklejam zaczątki kodu:
Wyświetla 230 V zamiast 2.30V i tylko z jednego kanału.
Ale powoli- dojdziemy.
Może jeszcze ktoś pomoże.
A tak mam ustawione końcówki do wyświetlacza:
W pliku .h
Wyświetlacz 2x16.
Ze sprawdzaniem zajętości- szybciej chodzi.
#include <HD44780.c>
Wpisał:
#include "HD44780.h"
A HD44780.c dodał do programu w Source Files to byłoby dużo lepiej.
Add Existing Source File(s).
Dołączanie przez #include plików z rozrzeżeniem .c jest paskudnym pomysłem.
Miotanie się od ściany do ściany w pewnym wieku nie przystoi.
Cierpliwości.
Program się powoli pisze- może trochę inny niż Twój.
Ale zaczyna działać.
Jestem tak samo głupi w C jak Ty- ale bardziej cierpliwy.
Tu wklejam zaczątki kodu:
Code:
#include <stdint.h>
#include <avr/io.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#include "HD44780.h"
volatile uint8_t dol;
volatile uint16_t gora;
volatile uint8_t flaga;
volatile unsigned int napiecie;
int main(void)
{
sei();
DDRB=255;
DDRC=255;
TIMSK=_BV(TOIE1);//ustawienie licznika T1
TCCR1B=_BV(CS10)|_BV(CS12);//na przerwanie OVF1 co ok.4s przy 16 MHz
// OCR0=250;
ADMUX = _BV(REFS0)|_BV(REFS1) ;//|_BV(ADLAR)
ADCSRA = _BV(ADEN)|_BV(ADIE)|_BV(ADATE)|_BV(ADPS0)|_BV(ADPS1)|_BV(ADPS2)|_BV(ADSC);
SFIOR=_BV(ADTS1)|_BV(ADTS2);//ustawienie startu przetwarzania ADC po przerwaniu od OVF Timer1
PORTB=255;
char *text="Problem z";
char *text1="przerwaniami";
LCD_Initalize();
LCD_WriteText(text);
LCD_GoTo(0,1);
LCD_WriteText(text1);
_delay_ms(300);
LCD_GoTo(0,0);
//itoa(napiecie);
LCD_WriteText(" ");// to jest szybciej niż LCD_Clear
char buffer_n[4];
// uint16_t napiecie;
// static int8_t test1;
while(1)
{
// test1=!test1;
// PORTC=test1;// to taki debug z braku JTAGa
if(flaga);
flaga=0;
dol=ADCL;// odczyt przetwornika ADC
gora=ADCH;
napiecie=gora+dol;
// napiecie = (gora<<2)*2.56/1024.0;
// gora=gora<<2;
LCD_GoTo(0,0);
LCD_WriteText(utoa(napiecie,buffer_n,10));
LCD_GoTo(5,0);
LCD_WriteText("V");
// a tu reszta programu-LCD, obliczenia itp.
}
}
ISR(ADC_vect)//a tu przerwanie od ADC- jak wystartował po OVF Timer1 i skończył
{ //przetwarzanie to tu jest i ustawia flagę
flaga=1;
// static int8_t test;
// test=!test;
// PORTB=test;// tu też debug
// gora=ADCH;
// dol=ADCL;
}
EMPTY_INTERRUPT(TIMER1_OVF_vect);// a tu puste przerwanie od OVF Timer0
Wyświetla 230 V zamiast 2.30V i tylko z jednego kanału.
Ale powoli- dojdziemy.
Może jeszcze ktoś pomoże.
A tak mam ustawione końcówki do wyświetlacza:
Code:
// Konfiguracja sygnałów sterujących wyświetlaczem.
// Można zmienić stosownie do potrzeb.
//
//-------------------------------------------------------------------------------------------------
#define LCD_RS_DIR DDRD
#define LCD_RS_PORT PORTD
#define LCD_RS_PIN PIND
#define LCD_RS (1 << PD0)
#define LCD_RW_DIR DDRD
#define LCD_RW_PORT PORTD
#define LCD_RW_PIN PIND
#define LCD_RW (1 << PD6)
#define LCD_E_DIR DDRD
#define LCD_E_PORT PORTD
#define LCD_E_PIN PIND
#define LCD_E (1 << PD1)
#define LCD_DB4_DIR DDRD
#define LCD_DB4_PORT PORTD
#define LCD_DB4_PIN PIND
#define LCD_DB4 (1 << PD2)
#define LCD_DB5_DIR DDRD
#define LCD_DB5_PORT PORTD
#define LCD_DB5_PIN PIND
#define LCD_DB5 (1 << PD3)
#define LCD_DB6_DIR DDRD
#define LCD_DB6_PORT PORTD
#define LCD_DB6_PIN PIND
#define LCD_DB6 (1 << PD4)
#define LCD_DB7_DIR DDRD
#define LCD_DB7_PORT PORTD
#define LCD_DB7_PIN PIND
#define LCD_DB7 (1 << PD5)
W pliku .h
Wyświetlacz 2x16.
Ze sprawdzaniem zajętości- szybciej chodzi.