DragonSoul:
Abychom ti pomohli, tak nam musis rict trochu vice.
Pokud si vytvoris pouze funkci cteni z eeprom tak ta ti funguje, nebo ne?
Pokud ano, chyba je nekde mimo program. Pokud ne, dej nekam komplet program na cteni eeprom abychom to zkoukli.
Tu je ten program. Dnes som vytvoril nový projekt AVR Studiu a skopíroval som tento program do neho a čuduj sa, na ostro fungoval, ale v simulátore stále nejde. Neviem si to vysvetliť, mám AVR Studio 6.2, či niečo zblblo, je to zaujímavé. Stretol sa niekto s takýmto niečim ?
[code]
/*
Kotlik.c
Created: 6. 9. 2015 22:32:05
Author: Palo
*/
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
#include <stdlib.h>
#include <stdio.h>
#include “max7219.h”
unsigned int Read_ADC(unsigned char channel){
// vloz cislo kanala, vymaskuj nepouzite bity
ADMUX &= 0xF0;
ADMUX |= channel & 0x0F;
// start conversion
ADCSRA |= (1 << ADSC);
// cakaj na priznak skoncenia konverzie
while(ADCSRA & (1 << ADSC));
// navratova hodnota - vysledok ad prevodu
return ADC;
}
int main(void)
{
char text[9];
int tep, tepn, u, cer, i, kur, blok, pamet, teplota, roz;
int pozi, pok, pok1;
static int poz[6];
cer = 0;
kur = 0;
blok = 0;
roz = 0;
pok1 = 0;
pamet = 0;
//**************** Nacitanie eeprom *********
uint16_t tmp;
uint8_t tmp1;
for(i=0; i<12; i=i+2)
{
tmp = eeprom_read_word((uint16_t*) i);
poz(i/2)] = (int) tmp;
}
tmp1 = eeprom_read_byte((uint8_t*) 12);
teplota = (int) tmp1;
//********************************************
tepn = 5;
pamet = 90;
DDRB |= (1 << PB0) | (1 << PB1) | (1 << PB2) | (1 << PB3) | (1 <<PB4) | (1 << PB5);
PORTB &=~(1 << PB0) | (1 << PB1) | (1 << PB2) | (1 << PB3) | (1 <<PB4) | (1 << PB5);
DDRD &=~(1 << PD0) | (1 << PD1) | (1 << PD2);
PORTD |=(1 << PD0) | (1 << PD1) | (1 << PD2);
ADMUX |= (1 << REFS0);
ADCSRA |= (1 << ADEN) | (1 << ADIF) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
sei();
max7219_init();
max7219_intensity(1);
sprintf(text,"--AhoJ--");
max7219_clear();
m_write_(text, 8);
_delay_ms(2000);
//******************** Otvorenie klapky *****************************************
PORTB |= (1 << PB0);
// Nacitanie
pozi = Read_ADC(1);
// Kontrola
while(pozi < poz[5])
{
pozi = Read_ADC(1);
}
// Odchod
PORTB &=~ (1 << PB0);
//*******************************************************************************
while(1)
{
//******************** Nacitanie teploty a tolerancia ***********************
pok = Read_ADC(0);
if(pok1 >= (pok +2) || pok1 <= (pok -2)){
pok1 = pok;
}
//************************** Vypocet teploty ********************************
u = ((long)pok1*500/1024)+2;
//************************** Zapnutie cerpadla ******************************
if(cer == 0 && u > 34){
PORTB |= (1 << PB2);
kur = 1;
PORTB &=~(1 << PB4);
PORTB |= (1 << PB3);
cer = 1;
blok = 0;
}
//************************** Vypnutie cerpadla *******************************
if(cer == 1 && u <31){
PORTB &=~(1 << PB2);
kur = 0;
PORTB |= (1 << PB4);
PORTB &=~(1 << PB3);
cer = 0;
blok = 1;
}
tep = teplota - u;
//*************************** Odblokovanie pri rozhoreni ****************************
if(blok == 1 && pamet < u){
blok = 0;
kur = 1;
PORTB &=~(1 << PB4);
}
//***********************************************************************************
if(kur == 1 && tep >= 0){
if(tep > 5){
if(roz == 1){
kur = 0;
PORTB |= (1 << PB4);
PORTB &=~ (1 << PB3);
blok = 1;
pamet = u;
goto asd;
}
tep = 5;
}
if(tep > tepn){
pozi = Read_ADC(1);
while(pozi < poz[tep]){
PORTB |= (1 << PB0);
pozi = Read_ADC(1);
}
PORTB &=~ (1 << PB0);
tepn = tep;
}
if(tep < tepn){
pozi = Read_ADC(1);
while(pozi > poz[tep]){
PORTB |= (1 << PB1);
pozi = Read_ADC(1);
}
PORTB &=~ (1 << PB1);
tepn = tep;
}
if(tep > 2){
PORTB |= (1 << PB3);
}
if(tep < 3){
PORTB &=~ (1 << PB3);
}
}
asd:
if(tep < 0){
pozi = Read_ADC(1);
while(pozi > poz[0]){
PORTB |= (1 << PB1);
pozi = Read_ADC(1);
}
PORTB &=~ (1 << PB1);
}
if(tep < 3)
{
roz = 1;
}
//*********************************** Tlacitko Menu ***************************************
if((PIND & (1 << PD1)) == 0 && (PIND & (1 << PD2)) == 0)
{
i = 0;
while (i < 6)
{
if((PIND & (1 << PD0)) == 0){
i += 1;
goto xxx;
}
if((PIND & (1 << PD1)) == 0){
poz* += 1;
}
if((PIND & (1 << PD2)) == 0){
poz* -= 1;
}
max7219_clear();
sprintf(text,"%1d - %4d", i, poz*);
m_write_(text, 8);
xxx:
_delay_ms(500);
}
for(i=0; i<11; i=i+2){
eeprom_write_word((uint16_t*) i, (uint16_t) poz(i/2)]);
}
}
//************************************* Tlac Start *****************************************
if((PIND & (1 << PD0)) == 0){
PORTB &=~(1 << PB4);
kur = 1;
roz = 0;
blok = 0;
}
//************************************ Tlacitko + teplota ***********************************
if((PIND & (1 << PD1)) == 0){
if(teplota < 79){
teplota += 1; //pridaj teplotu
}
roz = 0;
eeprom_write_byte((uint8_t*) 12, (uint8_t) teplota);
}
//************************************* Tlacitko - teplota ***********************************
if((PIND & (1 << PD2)) == 0){
if(teplota > 35){
teplota -= 1; //uber teplotu
}
eeprom_write_byte((uint8_t*) 12, (uint8_t) teplota);
}
//************************************* Vystup na Display ************************************
sprintf(text," %2d%3d'C", teplota-2, u);
if (roz == 1)
{
sprintf(text,"A%2d%3d'C", teplota-2, u);
}
max7219_clear();
m_write_(text, 8);
PORTB ^= (1 << PB5); //neguj PB5
_delay_ms(250);
PORTB ^= (1 << PB5); //neguj PB5
_delay_ms(250);
}
return 0;
}
[/code]***