Stránka 1 z 1

Atmega8 + problem fuses

Napsal: 09 říj 2011, 19:39
od pokrivnik
Zdravim, mám menší problém. Pripojil som k Atmege8 8MHz krištál a v AVR Studiu som nastavil v položke fuses Ext. RC Osc. 3.0 MHz - 8.0 MHz; Start-up time: 18CK + 64ms a keď som dal program, vyskočila známa hláška AVR ISP error.

Čo sa mohlo pokaziť? Nastavil som to zle alebo to proste zblblo? Aké sú teraz možnosti opravy? Pomôže len paralelný programátor alebo iná frekvencia kryštálu?

Ak to je zle, ako by to malo byť nastavené? Pretože som to asi pravdepodobne zle pochopil po prečítaní datasheetu.

Ďalší dotaz. Skúšal som rozbehať UART na internom oscilátore 1MHz(defaultné nastavenie), no hádzalo to blbé znaky, respektíve stále ten istý znak dokola "<0>". Môže to byť spôsobené chybou vnútorného oscilátora alebo chybou prepočtu(0.2% podľa tabuľky v datasheete)?

Ďakujem vopred sa rady :D

Napsal: 09 říj 2011, 19:59
od Andrea
Když chceš krystalový oscilátor, tak proč nastavuješ RC oscilátor? Teď musíš připojit externí RC oscilátor, abys to mohl znovu přeprogramovat.

Napsal: 09 říj 2011, 19:59
od nekmil
K Atmega jsi připojil krystal a v "pojistkách" nastavuješ externí RC oscilátor. Nezdá se Ti, že děláš něco špatně ? :D

Napsal: 09 říj 2011, 20:21
od pokrivnik
Ahaaa, kurnajs, tak to som troška prepískol. Takaa chyba :oops: Ešte že na to stačí ten RC oscilátor. 2kohm rezistor a 22pF kondik by to mali zmáknuť, len podľa datasheetu je potrebné na XTAL2 pripojiť NC. RC oscilátory v predaji taký výstup majú, no ak tam dám iba kondík a rezistor takú možnosť akosi nemám. Čo to je vlastne to NC?

Napsal: 09 říj 2011, 20:29
od mikollar
dufam ze netresne blbost ale NC je vacsinou not conected - nezapojene

Napsal: 09 říj 2011, 20:29
od Andrea
NC - not connected = nezapojen
Kde jsi viděl v prodeji RC oscilátor, nepleteš si to zase s krystalovým oscilátorem? :roll:

Napsal: 09 říj 2011, 20:52
od pokrivnik
Andrea píše:NC - not connected = nezapojen
Kde jsi viděl v prodeji RC oscilátor, nepleteš si to zase s krystalovým oscilátorem? :roll:


Máš pravdu, zase som si to splietol :oops: keď sa darí, tak sa darí. Asi by som si mal dať pauzu...

Tak ja to skúsim dať dokopy zajtra.

Teraz by ma zaujímalo, ako je to s tým UART-om. Nahodil som druhú atmegu, teraz som ale všetko nastavil správne :) No cez UART mi stale nehadže to čo by malo. Stále vypisuje "<0>". Cez hyperterminal v XP mi nezobrazuje nič. Fungujem cez program Terminal 1.9b. Je nejaká definovaná maximálna dĺžka káblov medzi Atmegou a MAX232 a MAX232 a RS232 v PC?


Pre istotu pridávam aj zdrojový kód.

Kniznica:

#include <avr\io.h>

/* baud rate register value calculation */
#define CPU_FREQ 8000000UL // If CKDIV8 checked, then /8!
#define BAUD_RATE 9600
// BAUD = f / 16 * (UBR+1) alebo UBR = CPUFREQ/16/BAUD_RATE-1
#define BRREG_VALUE 51 // hodnota z tabulky v datashhete pre 8MHz


/* definitions for UART control */
#define BAUD_RATE_LOW_REG UBRRL // ??? (Staci Low Byte, < 255 )
#define UART_CONTROL_REG_B UCSRB // OK, checked
#define ENABLE_TRANSMITTER_BIT TXEN // OK, checked
#define ENABLE_RECEIVER_BIT RXEN // OK, checked
#define UART_STATUS_REG UCSRA // OK, checked (but also control reg.)
#define DATA_REGISTER_EMPTY_BIT UDRE // Added, for possible speed-up
#define TRANSMIT_COMPLETE_BIT TXC // OK, checked
#define RECEIVE_COMPLETE_BIT RXC // OK, checked
#define UART_CONTROL_REG_C UCSRC // Added for mode setting
#define UART_DATA_REG UDR // OK, checked



void inituart(void)
{
BAUD_RATE_LOW_REG = BRREG_VALUE; // OK, preddelic pre 9600
// bit 2x = 0
UART_CONTROL_REG_C = (1<<UCSZ1)|(1<<UCSZ0); // Added: Async. UART, None
// Parity, 8-data, 1 stopbit
UART_CONTROL_REG_B = (1 << ENABLE_RECEIVER_BIT)|
(1 << ENABLE_TRANSMITTER_BIT); // enable receive + transmit

}


void sendchar(unsigned char c)
{
UART_DATA_REG = c; // prepare transmission
while (!(UART_STATUS_REG & (1 << TRANSMIT_COMPLETE_BIT)));// wait until byte sendt
UART_STATUS_REG |= (1 << TRANSMIT_COMPLETE_BIT); // delete TXCflag
}


unsigned char recchar(void)
{
while( !(UART_STATUS_REG & (1 << RECEIVE_COMPLETE_BIT)) ); // wait for data
return UART_DATA_REG;
}




vlastny kod:

#include <avr\io.h>
#include <stdio.h>
#include "serial.h"


int main(void)
{
char c;

DDRD = 0b00000010;
PORTD = 0b00000011; // Set TxD pin as an output, RxD input

inituart();
sendchar('1');
//sendchar('A');
sendchar('a');
sendchar('2');
sendchar('b');
sendchar('\n');

for (c=32;c<=150;c++)
sendchar(c);

for (;;) {
/* Do nothing */
}
}

[/b]

Napsal: 09 říj 2011, 20:57
od Andrea
pokrivnik píše:#define CPU_FREQ 8000000UL // If CKDIV8 checked, then /8!

Neříkal jsi, že máš nastavený 1MHz interní oscilátor? Tak proč máš v programu nastaveno 8MHz? Kdyby sis přečet, co je v tom komentáři.

Napsal: 09 říj 2011, 20:59
od pokrivnik
Andrea píše:
pokrivnik píše:#define CPU_FREQ 8000000UL // If CKDIV8 checked, then /8!

Neříkal jsi, že máš nastavený 1MHz interní oscilátor? Tak proč máš v programu nastaveno 8MHz? Kdyby sis přečet, co je v tom komentáři.


To je už upravene na 8MHz ktory mam aktualne pripojeny. Sry to som zabudol dopisat :roll:

Napsal: 09 říj 2011, 21:14
od Andrea
Pro zápis do UCSRC musí bít nastaven URSEL:

UART_CONTROL_REG_C = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // Added: Async. UART, None

Napsal: 09 říj 2011, 21:27
od pokrivnik
Andrea píše:Pro zápis do UCSRC musí bít nastaven URSEL:

UART_CONTROL_REG_C = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // Added: Async. UART, None


Parááááda, ďakujem veeeeeľmi pekne, funguje to. Sám by som do toho čumel možno celý deň a stále to prehliadal. :D