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]***