Atmega128 problem

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
Awatar użytkownika
M@ciej
Użytkownik
Posty: 736
Rejestracja: 13 sie 2005, 21:38
Lokalizacja: Szczecin

Atmega128 problem

Post autor: M@ciej » 14 lis 2009, 18:24

Witam.

Piszę program w Bascomie na Atmegę128.
Pisząc taki oto kod:

Kod: Zaznacz cały

$regfile = "m128def.dat"
$crystal = 8000000

Config Porta = Input
Porta = &B11111111
Config Portc = Output
Portc = &B00000000


Do

Toggle Portc.1
Waitms 25
Loop
End
program zachowuje się dość nietypowo.
Dioda dołączona do Portc.1 zamiast migać, świeci. Gdy chcę przepisać bity z portu A do C (portA dipswitch, portC 8 diod LED do masy) to w ogóle nie reaguje. Wyłączyłem JTAG a zegar ustawiony w Fusebitach na wewnętrzny 8MHz.

Pierwszy raz pracuję z Atmega128 i ten procek wydaje mi sie nieco inny od np. Atmega8.

Czy coś robię nie tak? Pomóżcie!

snow
Użytkownik
Posty: 794
Rejestracja: 16 sty 2007, 3:44
Lokalizacja: lubelskie
Kontakt:

Post autor: snow » 14 lis 2009, 19:25

Może trzeba w fusach wyłączyć "ATmega103 compatibility mode" i watchdog'a

Awatar użytkownika
Pikczu
Użytkownik
Posty: 754
Rejestracja: 18 lip 2005, 18:33
Lokalizacja: Dublin
Kontakt:

Post autor: Pikczu » 14 lis 2009, 21:16

Potwierdzam na 100% ustaw extended fuse bit na atmega128 mod
Ustaw np tak fusy (zewnętrzny kwarc)
$prog &HFF , &HBF , &H99 , &HFF ' generated. Take care that the chip supports all fuse bytes.

Awatar użytkownika
M@ciej
Użytkownik
Posty: 736
Rejestracja: 13 sie 2005, 21:38
Lokalizacja: Szczecin

Post autor: M@ciej » 14 lis 2009, 21:24

Troche pomogło ustawienie Fusebitu na Atmega128mode, ale w pętli:

Kod: Zaznacz cały

Do

If Porta.1 = 0 Then Portc.1 = 1
Toggle Portc.7
Waitms 100
Loop
instrukcja Toggle działa i dioda LED miga, ale warunek już nie działa

Wole nie ustawiać Fusebitów w ciemno, bo to najprostsza droga do zablokowania procka, a Atmegę128 ciężko wylutować. Chyba, że Kolega opisze drugi i trzeci Fusebit,bo u mnie właśnie te się różnią.

Awatar użytkownika
Pikczu
Użytkownik
Posty: 754
Rejestracja: 18 lip 2005, 18:33
Lokalizacja: Dublin
Kontakt:

Post autor: Pikczu » 14 lis 2009, 21:44

Źle napisałeś jeśli porta masz ustawione jako wejście, i masz tam jakis przycisk to
po primo: powinieneś napisać PINA.1 a nie porta.1
po drugie primo: jaki piszesz then to resztę dajesz w następnej linii.
po trzecie primo brakuje ci end if

Kod: Zaznacz cały

$prog &HFF , &HBF , &H99 , &HFF                             ' generated. Take care that the chip supports all fuse bytes.
$regfile = "m128def.dat"
$crystal = 8000000

Config Porta = Input
Porta = &B11111111
Config Portc = Output
Portc = &B00000000


Do
If Pina.1 = 0 Then
Portc.1 = 1
End If
Toggle Portc.7

Waitms 100
Loop
I działa to tak dioda miga na portc.7
A jak zmienisz stan na wejściu na niski to na portc.1 ustawia się stan wysoki i koniec robi się to tylko raz i d..a.
Wiec działa jak by jednorazowo.

Awatar użytkownika
M@ciej
Użytkownik
Posty: 736
Rejestracja: 13 sie 2005, 21:38
Lokalizacja: Szczecin

Post autor: M@ciej » 14 lis 2009, 21:55

Faktycznie, zapomniałem. Powinno być PIN a nie PORT. Teraz już działa!

Co do warunków, to może być po THEN coś ale zdaje się tylko jedna instrukcja, jeśli ma być więcej instrukcji w warunku, to trzeba stosować już If...End If.

Mam jeszcze pytanie o PortG. Czy da się go jakoś obsłużyć w Bascomie?

Awatar użytkownika
Pikczu
Użytkownik
Posty: 754
Rejestracja: 18 lip 2005, 18:33
Lokalizacja: Dublin
Kontakt:

Post autor: Pikczu » 14 lis 2009, 22:04

A nie działa ??
ja nigdy nie próbowałem.

Kod: Zaznacz cały

$prog &HFF , &HBF , &H99 , &HFF                             ' generated. Take care that the chip supports all fuse bytes.
$regfile = "m128def.dat"
$crystal = 16000000

Config Porta = Input
Porta = &B11111111
Config Portg = Output
Portg = 0

Do


  Set Portg.1
    Waitms 30
    Reset Portg.1
    Waitms 75
    Set Portg.1
    Waitms 30
    Reset Portg.1

    Waitms 75
    Set Portg.2
    Waitms 20
    Reset Portg.2
    Waitms 100
    Set Portg.2
    Waitms 20
    Reset Portg.2
    Waitms 75
 Loop
U mnie działa Ok

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 15 lis 2009, 10:50

Jeżeli jakiś port fizycznie jest w procesorze to musi się go dać obsłużyć. Nawet jak by BASCOM miał z tym problemy (dosyć często się to wbrew pozorom zdarza), to i tak jest to możliwe przez bezpośrednie odwoływanie sie do rejestrów I/O tego portu. Dosyć często zdarzają się w BASCOM problemy z Timerami i WatchDogiem (ale wynika to raczej z bajzlu jaki w tej dziedzinie Atmel zrobił w procach AVR), wtedy albo bezpośrednie operacje na rejestrach, a w przypadku WDT najlepiej asemblerowa wstawka.
Np. ja do dziś walczę z ATTiny2313, w którym z pinów gdzie normalnie jest kwarc zrobiłem port I/O i na nim zaprogramowałem magistrale I2C, ale nie działa mi to z jakiegoś powodu poprawnie, i dane są zapisywane do pamięci w losowych jej miejscach. BASCOM żadnego błędu nie pokazuje, i nie wiem co boli program po dzień dzisiejszy :?:

ODPOWIEDZ