Mam taki problem, że zrobiłem projekt Odbiornika Morsa na ATmedze8. W oryginalnym projekcie jest kwarc 10 MHz, a ja użyłem 10.240 MHz gdyż taki miałem w domu, a sklepu elektronicznego w mojej okolicy nie ma.
Jak podłącze ten odbiornik do komputera i z programu morsik coś wysyłam to np. "adrian" dekoduje poprawnie, a "jarek" już nie, tylko na LCD pojawia się "wtarek".
Pisałem do autora projektu i powiedział mi, że najprawdopodobniej problem leży w Baskomie, coś z czasami. Strona projektu http://www.henwyd.republika.pl/TekstyHTML/Atmega8OdbText.htm Oto kod:
Ktoś widzi co tu jest nie tak, zmieniłem LCD z 2x16 na 1ax16 i czestotliwość kwarcy, fusbity to low 0xee high 0xd9
Dodano po 3 [minuty]:
A i dodałem to z "Odbiornik CW" na LCD z opóźnieniem czasowym.
Jak podłącze ten odbiornik do komputera i z programu morsik coś wysyłam to np. "adrian" dekoduje poprawnie, a "jarek" już nie, tylko na LCD pojawia się "wtarek".
Pisałem do autora projektu i powiedział mi, że najprawdopodobniej problem leży w Baskomie, coś z czasami. Strona projektu http://www.henwyd.republika.pl/TekstyHTML/Atmega8OdbText.htm Oto kod:
$regfile = "m8def.dat" 'Informacja dla kompilatora.
$crystal = 10240000 'Też dla kompilatora,zastosujemy kwarc zewnętrzny 10.240MHz.
Config Lcd = 16 * 1a
Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.6 , E = Portd.1 , Rs = Portd.0
'Informacja na jakich Pinach będzie Lcd.
Cursor Off
Cls
Lcd " Odbiornik CW"
Wait 4
Config Timer0 = Timer , Prescale = 1 'Timer0 jako czasomierz, bez podziału wstępnego.
Config Timer1 = Counter , Edge = Falling 'Timer1 jako licznik, od zbocza opadającego.
Deflcdchar 0 , 32 , 32 , 32 , 31 , 31 , 32 , 32 , 32 'Kreska (Rysujemy tutaj: Ctrl+L i LCD Designer).
Deflcdchar 1 , 32 , 32 , 32 , 12 , 12 , 32 , 32 , 32 'Kropka
Cls 'Czyść LCD.
Dim Licz As Word 'Zmienna Licz, pamięta czas kresek, kropek i przerw.
Dim Tmp As Long 'Tmp, zmienna pomocnicza w algorytmie liczenia ilości kresek i kropek.
Dim Pozycja As Long 'Pozycja, to samo.
Dim Znak As Long 'Znak, zmienna zapamiętująca ilość kresek i kropek.
Dim Policzlcd As Byte '1 bajt zmiennej zawierającej piksele Lcd, aby napis nie wyszedł poza Lcd.
On Timer0 Zlicz 'Podprogram Timer-a0, wykonuje liczenie czasu trwania litr, cyfr i przerw.
'
Config Pind.7 = Input 'Ustawiamy Pind.7 jako wejście.
Config Pind.5 = Input 'Ustawiamy Pind.5 jako wejście.
Config Pinc.5 = Input 'Ustawiamy Pinc.5 jako wejście (W1).
Set Portc.5 'Ustaw 1 w Portc.5.
Config Pinc.3 = Input 'Ustawiamy Pinc.3 jako wejście (W2).
Set Portc.3 'Ustaw 1 w Portc.3.
Enable Interrupts 'Zezwolenie na wszystkie przerwania.
Enable Timer0 'Odblokuj przerwania Timera0.
Counter1 = 0 '
Start Timer1 '
Stop Timer0 '
'--------------------------------------------------------------------------------------------------------------
'Pierwsza pętla. Decyduje: kreski-kropki czy litery-cyfry.
Do '
If Pinc.3 = 0 Then 'Jeśli W1 włączony. Portc.3 do masy, to...
Gosub Literycyfry 'skocz do programu Literycyfry.
Else 'W przeciwnym razie...
Gosub Kreskikropki 'skocz do programu Kreskikropki.
End If 'Koniec warunku.
Loop 'Zamknij pętlę.
End 'Koniec tej pętli.
'------------------------------------------------------------------------------------------------------------
Literycyfry: '
Do 'Pętla (pierwsze instrukcje, gdy nie odbieramy jeszcze telegrafii).
Bitwait Pind.7 , Set 'Poczekaj, aż Pind.7 będzie miał 1. Właśnie jest 1.(Taka sytuacja jest, gdy nie ma odbioru Morsa).
Start Timer0 'Start Timera0.
If Counter1 > 140 Then 'Jeśli licznik zliczył więcej, niż 140 impulsów, to...(Teraz nie zliczy, nie ma odbioru).
Tmp = 10 ^ Pozycja 'Wykonaj algorytm.
Tmp = 2 * Tmp '
Znak = Znak + Tmp '
Incr Pozycja '
Else 'W przeciwnym razie.
If Counter1 > 40 Then 'Jeśli licznik zliczył więcej niż 40 impulsów, ale...
If Counter1 < 80 Then 'mniej niż 80, to...
Tmp = 10 ^ Pozycja 'Wykonaj algorytm.
Znak = Znak + Tmp '
Incr Pozycja '
End If '
End If '
End If '
Stop Timer1 '
Counter1 = 0 '
Bitwait Pind.7 , Reset 'Poczekaj, aż Pind.7 osiągnie poziom niski (jest odbiór).
Start Timer1 'Wystartuj Timer1.
Stop Timer0 'Zatrzymaj Timer0..
Loop 'Koniec pętli.
End '
Return ' Wróć do programu.
'------------------------------------------------------------------------------------------------------------
Kreskikropki: 'Podprogram.
Do 'Pętla (pierwsze instrukcje, gdy nie odbieramy jeszcze telegrafii).
Bitwait Pind.7 , Set 'Poczekaj, aż Pind.7 będzie miał 1. Właśnie jest 1.(Taka sytuacja jest, gdy nie ma jeszcze odbioru Morsa).
Incr Policzlcd 'Jeśli Portd.7=1, zapełniaj zawartość zmiennej Policzlcd.
If Policzlcd > 11 Then 'Jeśli Policzlcd przekroczy 11, a...
If Licz = 0 Then 'Zmienna Licz będzie 0, to...
Cls 'Wyczyść Lcd i zacznij pisać od początku na Lcd (żeby napis nie wyszedł poza Lcd).
Policzlcd = 0 'Wyzeruj zmienną.
End If '
End If 'Koniec warunku.
Start Timer0 'Start Timera0.
If Counter1 > 140 Then 'Jeśli licznik zliczył więcej, niż 140 impulsów, to...(Teraz nie zliczył, nie ma jeszcze odbioru).
Lcd Chr(0) 'Wyświetl kreskę. Przygotowaliśmy jej konstrukcję (Deflcdchar). Teraz nie wyświetli.
Else 'W przeciwnym razie...(To znaczy: gdy Pind.7 reset)
If Counter1 > 40 Then 'Jeśli licznik zliczył więcej niż 40 impulsów, ale...
If Counter1 < 80 Then 'mniej, niż 80.
Lcd Chr(1) 'Wyświetl kropkę. Przygotowaliśmy ją wcześniej: Deflcdchar 1 , 32 , 32 , 32 , 12 , 12 , 32 , 32 , 32.
End If 'Koniec warunków.
End If '
End If '
Stop Timer1 '
Counter1 = 0 '
Bitwait Pind.7 , Reset 'Poczekaj, aż Pind.7 osiągnie poziom niski (jest odbiór).
Start Timer1 'Wystartuj Timer1.
Stop Timer0 'Zatrzymaj Timer0..
Loop 'Koniec pętli.
End '
Return 'Wróć do programu.
'-------------------------------------------------------------------------------------------------------------
Zlicz: 'Podprogram Zlicz.
Incr Licz 'Powiększaj zawartość zmiennej o 1.
If Licz > 6250 Then 'Jeśli osiągnie 6250, to...
Licz = 0 'Zeruj zmienną.
Incr Policzlcd 'Zapełniaj zawartość zmiennej Policzlcd (iloscią pól Lcd).
If Policzlcd = 16 Then 'Jeśli Policzlcd osiągnie 16 pól Lcd, to...
Cls 'Wyczyść Lcd i zacznij pisać od początku na Lcd (żeby napis nie wyszedł poza Lcd).
Policzlcd = 0 'Wyzeruj zmienną.
End If 'Koniec warunku
Stop Timer0 '
If Pinc.5 = 0 Then 'Jeśli Portc.5 otrzymał masę wyłącznikiem W1, to...
Lcd Chr(124) 'Wyświetl kreskę pionową.
End If 'Koniec tego warunku.
Gosub Zapisz 'Skocz do podprogramu Zapisz.
Pozycja = 0 'Zeruj zmienną.
Znak = 0 'Zeruj zmienną.
End If 'Koniec warunku.
Return 'Wróć do programu.
'--------------------------------------------------------------------------------------------------------------
Zapisz: 'Podpogram podprogramu Zlicz.
Select Case Znak 'Instrukcja wyboru jednego z wielu. Jeśli Znak przyjmie wartość, to...
Case 111 : Lcd "S" '
Case 1221 : Lcd "P" '
Case 22111 : Lcd "3" '
Case 2221 : Lcd "J" '
Case 1212 : Lcd "C" '
Case 122 : Lcd "G" '
Case 21 : Lcd "A" '
Case 1112 : Lcd "B" '
Case 112 : Lcd "D" '
Case 1 : Lcd "E" '
Case 1211 : Lcd "F" '
Case 1111 : Lcd "H" '
Case 11 : Lcd "I" '
Case 212 : Lcd "K" '
Case 1121 : Lcd "L" '
Case 22 : Lcd "M" '
Case 12 : Lcd "N" '
Case 222 : Lcd "O" '
Case 2122 : Lcd "Q" '
Case 121 : Lcd "R" '
Case 2 : Lcd "T" '
Case 211 : Lcd "U" '
Case 2111 : Lcd "V" '
Case 221 : Lcd "W" '
Case 2112 : Lcd "X" '
Case 2212 : Lcd "Y" '
Case 1122 : Lcd "Z" '
Case 22221 : Lcd "1" '
Case 22211 : Lcd "2" '
Case 21111 : Lcd "4" '
Case 11111 : Lcd "5" '
Case 11112 : Lcd "6" '
Case 11122 : Lcd "7" '
Case 11222 : Lcd "8" '
Case 12222 : Lcd "9" '
Case 22222 : Lcd "0" '
Case 212121 : Lcd "." '
Case 221122 : Lcd "," '
Case 212211 : Lcd "_" '
Case 111222 : Lcd ":" '
Case 112211 : Lcd "?" '
Case 211112 : Lcd "-" '
Case 12112 : Lcd "/" '
Case 212212 : Lcd "()" '
Case 21112 : Lcd "=" '
Case 121221 : Lcd "@" '
Case 112211 : Lcd "POWTORZ" '
Case 12111 : Lcd "ZROZUMIALEM" '
Case 21212 : Lcd "ZACZYNAMY" '
Case 12121 : Lcd "KONIEC" '
Case 11111111 : Lcd "POMYLKA" '
Case 11122 : Lcd "CZEKAJ" '
Case 111222111 : Lcd "SOS" '
End Select 'Koniec selekcji.
Return 'Wróć do podprogramu Zlicz. '
Ktoś widzi co tu jest nie tak, zmieniłem LCD z 2x16 na 1ax16 i czestotliwość kwarcy, fusbity to low 0xee high 0xd9
Dodano po 3 [minuty]:
A i dodałem to z "Odbiornik CW" na LCD z opóźnieniem czasowym.
