často je problém s tím, že nemáš povolený optimalizace. Bez nic h to nechodí. Doporučuju O0.
Abys nemál začátečníky.
Knihovna util/delay.h chodí právě se všemi optimalizacemi kromě O0.
často je problém s tím, že nemáš povolený optimalizace. Bez nic h to nechodí. Doporučuju O0.
Obsluhu v přerušení řeším tak, že:
1. zakážu ostatní přerušení
2. zapamatuji registry (to zatím nedělám, ale asi by se mělo:-) )
3. udělám obsaluhu daného časovače
4. obnovím registry
5. povolím ostatní přerušení
co se stane, když obsluhuji jeden časovač, jsem tedy v bodě (3) a najednou dojde k přetečení časovače druhého?
void uart_puts (char *s)
{
while (*s)
uart_putc(*(s++));
}
Funkce getchar() a putchar() nejdou použít bez předchozího přesměrování.
Jednodušší je tady použít vlastní funkce pro UART.
#include <avr/io.h>
// get char
unsigned char uart_getc( void )
{
/* Wait for data to be received */
while ( !(UCSRA & (1<<RXC)) )
;
/* Get and return received data from buffer */
return UDR;
}
// send char
void uart_putc(unsigned char data )
{
while ( !( UCSRA & (1<<UDRE)) )
;
UDR = data;
}
int main(void)
{
char znak;
/***** inicializace uart *****/
UCSRA = 0x00;
UBRRH = 0x00; // nastaveni rychlosti pro krystal 8MHz
UBRRL = 0x33;
UCSRB = 0x18; // povolit vysilani a prijem
UCSRC = 0x86; // ramec dat: 8 datovych, 1 stop bit, bez parity
while(1)
{
znak=uart_getc();
uart_putc(znak);
}
}
Něco v Keil je špatně nastaveno.
V "Options for Target" - Target zatrhněte volbu Use On-chip ROM.
Tamtéž okénka Off-chip memory musí být prázdná.
Zkoušel jsem s Keil2, nevím jestli to u vás bude stejné.
Ještě doplním, že pin AVCC musí být vždy propojen s VCC, i když nepoužijeme AD konverzi.
VCC musí být perfektně filtrované.
I k AREF můžeme zkusit přidat elektrolyt, kdyby hodnoty nebyly stabilní.
Příklad vše vysvětlí.
$regfile = "m8def.dat"
$crystal = 10000000
$hwstack = 32
$swstack = 8
$framesize = 16
'Použijeme vnitřní referenční napětí Uref.
'Má být 2,56 V. Přesnou hodnotu změříme na pinu AREF.
'Na pinu AREF je filtrační kond 100k proti zemi.
Config Adc = Single , Prescaler = Auto , Reference = Internal
Start Adc
Defword U
Dim U As Long
Uref = 2560 '[mV]
Do
U0 = Getadc(0) 'pin ADC0 (PortC.0)
U1 = Getadc(1) 'pin ADC1
U2 = Getadc(2) 'pin ADC2
'atd
U = U0 * Uref
U = U / 1024 'napětí na ADC0 v milivoltech
Loop
End
Na pinu s tlačítkem musí být pull-up:
Config Portc = Output
Config Portd = Input
Portd.6=1
Tlacitko Alias Pind.6
DDRB == _BV(PB0); // DDR = "Data Direction Register"
PORTB == ~(_BV(PB0));