Atmega8 + problem fuses

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
pokrivnik
Příspěvky: 79
Registrován: 05 úno 2009, 00:00

Atmega8 + problem fuses

#1 Příspěvek 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
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#2 Příspěvek 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.
Uživatelský avatar
nekmil
Příspěvky: 787
Registrován: 06 bře 2005, 00:00
Bydliště: Havířov

#3 Příspěvek 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
Uživatelský avatar
pokrivnik
Příspěvky: 79
Registrován: 05 úno 2009, 00:00

#4 Příspěvek 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?
Uživatelský avatar
mikollar
Příspěvky: 1477
Registrován: 26 pro 2004, 00:00
Bydliště: Košice - okolie

#5 Příspěvek od mikollar »

dufam ze netresne blbost ale NC je vacsinou not conected - nezapojene
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#6 Příspěvek 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:
Uživatelský avatar
pokrivnik
Příspěvky: 79
Registrován: 05 úno 2009, 00:00

#7 Příspěvek 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]
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#8 Příspěvek 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.
Uživatelský avatar
pokrivnik
Příspěvky: 79
Registrován: 05 úno 2009, 00:00

#9 Příspěvek 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:
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#10 Příspěvek 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
Uživatelský avatar
pokrivnik
Příspěvky: 79
Registrován: 05 úno 2009, 00:00

#11 Příspěvek 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
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“