Skocz do zawartości

InspektorGadzet

Użytkownicy
  • Zawartość

    143
  • Rejestracja

  • Ostatnio

  • Wygrane dni

    2

InspektorGadzet wygrał w ostatnim dniu 19 lipca

InspektorGadzet ma najbardziej lubianą zawartość!

Reputacja

14 Dobra

O InspektorGadzet

  • Ranga
    5/10

Informacje

  • Płeć
    Brak informacji
  • Języki programowania
    C, ASM
  • Zawód
    Główny konstruktor elektronik

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

  1. Tyle, że @NeverGiveUp1995, bez zastanowienia, wybrał płytkę, która ma tylko jednego UART'a. Zawsze jest jednak wyjście, na przykład SC16IS7xx ale taniej wybrać płytkę z wymaganymi peryferiami. Jak bym tak każdemu bezinteresownie robił projekty, to: - Nic innego bym nie robił. - Umarłbym z głodu. - Zanim bym umarł płaciłbym kary za niewywiązanie się ze swoich zobowiązań. Chciałem znaleźć gotowca i natrafiłem na stronie Nettigo na "mądrość ludową" przypominającą mi powiedzenie "Tam gdzie się kończy głupota cywilna, zaczyna się mądrość wojskowa": "Z praktyki Nie używaj przerwań, jeśli potrafisz znaleźć inne rozwiązanie. Programy wykorzystujące przerwania trudniej diagnozować (debuggować) jeżeli coś działa nie tak jak się spodziewasz." Widać, że autor tego tekstu ma kiepską praktykę. Właśnie wszystko co się da należy realizować na przerwaniach. To upraszcza kod dlatego mogę napisać, że na stronie Nettigo nie ma co szukać i nie polecam jej. Przypomniało mi się, że kody obsługi wyświetlaczy jakie tam znalazłem są ŻENUJĄCE. Nie nadają się nawet na demo, a z powyższą "mądrością" to nie spodziewam się, że coś wartościowego można na tej stronie znaleźć
  2. Może zapoda. Ja nie, bo pomagać to i owszem, pomagam, ale roboty, jak większość forumowiczów, tym bardziej za darmo, nie robię Czego konkretnie? Wskazałem błędy, trzeba je tylko wyeliminować.
  3. Czy ja dobrze widzę while (PiecSerial.available ()) { bajtOdebrany = PiecSerial.read(); ramkaCO[i] = bajtOdebrany; i++; delay(10); } Odbierasz bajt, czekasz 10ms, odbierasz kolejny. Przy 9600 1 bajt trwa ok 10ms czyli przez delay 10ms, tracisz 10 znaków. Jakiś tam bufor masz, ale po 10 obiegach tej pętli , gdyby nie było bufora, tracisz ok 90 znaków, 100 obiegach 900 znaków. Bufor typowo ma 64 znaki, więc po 6 obiegach pętli zaczynasz tracić znaki. Dodatkowo, program jest blokowany przez Serial.print(ramkaCO[i], HEX); } Serial.println("----------"); Policz teraz czy odbierasz mniej więcej wielkość bufora - liczba obiegów pętli * 9 - czas nbadawania znaków na sprzetowym UART. Jak to się zgadza to wiesz gdzie masz błąd a nawet dwa. Jaki był cel delay(10)? Co chciałeś osiągnąć? Dlaczego nie używasz bufora nadawczego i nadawania w przerwaniach lub z wykorzystaniem DMA ? Teraz, nadając sprzętowym UART blokujesz program. To też wpływa na gubienie znaków a masz ESP, z dosyć dużą pamięcią RAM na bufory oraz z DMA. Czemu służą delay(300) w tym fragmencie? while (!PiecSerial) delay(300); Serial.println("Software serial gotowy!"); delay(300); Masz jakąś premię od szefa za liczbę użytych delay? Aby program działał lub działał lepiej powinieneś: - wywalić delay i wszelkie konstrukcje while(zdarzenie), - nie używać softwarowych UART, I2C, SPI (niezbyt szybki master I2C czy SPI może być), - używać buforów nadawczych.
  4. Na ARM trzeba mieć licencję. Dali za free co jest mało wydajne i się słabo sprzedaje, tak jak kiedyś Protel Autotraxa. Poza tym, czytałem, że coś Ci tam nie "rynksztosuje". Szansy na cos szybszego to też chyba nie ma, no i cena owej implementacji. Kupno mikrokontrolera będzie tańsze, chyba, ze będziesz produkował w milionach sztuk. Kedyś byłe zachwycony FPGA ale mi przeszło. Czy to ARM? Kompilatory są dopracowane jak dla ARM?
  5. Błąd. Mogę sobie sfotografować jakąś PCB i napisać jakie to genialne. Schemat, rysunek PCB oraz kod wynikowy (jeśli zastosowano w projekcie układ programowalny) powinien być wymagany. Ewentualnie, jak coś jest naprawdę ciekawego to zamiast kodu film z działania urządzenia. Mam dużo projektów, które nie zostały zrealizowane, z różnych powodów. Mam je wszystkie tu umieścić z opisem jak cudownie działają? Jeden z nich to Rewelka! tyle, że jednak energie pobiera, ale to: Mogę zamieścić w DIY? Nawet film jest. Ta zabawka z 1:36 faktycznie działa ale dysk po prostu cały czas spada choć porusza się w górę.
  6. FPGA != RETRO Dlatego pojawiają się repliki Cobry1 itp. Ponadto mowa była o 68k a to chyba nie jest 8-bit, nawet gdy mowa o 68008 . Pierwsze 68k były 16/32-bit, od 68020 32-bit.
  7. Jeśli chcesz się czegoś nauczyć to ok bo z ekonomicznego punktu widzenia, FPGA są niestety drogie. Ponadto najczęściej FPGA musi być wspomagana przez CPU. Może owe CPU zaimplementowaćw w FPGA, ale pochłania zasoby no i jaki CPU umieścisz w FPGA? Niedopracowany darmowy, niewydajny 8051? ARM raczej nie umieścisz W praktyce, po FPGA sięgałem aby zrobić układ wizyjny, teraz w takiej sytuacji sięgam po RPi. W czasach świetności portu LPT używałem większych CPLD bo dostępne wtedy mikrokontrolery nie dawały rady z EPP. Teraz, bez problemu EPP można zrealizować na mikrokontrolerze tylko po co? LPT "umarł", nawet w przemyśle już raczej tylko USB.
  8. W załączniku ZIP68000.zip. Do obrazków użyj IrfanView on rozpoznaje Amigowy format IFFILBM. W archiwum znajdziesz programy testowe (*.s) ; Nie dajemy dyrektywy ORG $000000 bo bëdzie úle,jeôli brak dyrektywy ; to i tak kompilator skompiluje od adresu $000000 dodajâc tablicë relokacji ; adresy w rozkazach ukazane w listingu sâ nieprawdziwe. Rzeczywisty adres ; jest równy ADRES-adres dîugiego sîowa pod "dc.l start" ;---------------- Podziaî pamiëci RAM ---------- data_user equ $0000 ;Poczâtek danych urzytkownika ;... dane urzytkownika ;---------------- Staîe ------------------------ LED equ $c20000 ;Adres zatrzasku 74HCT574 FLASH_ERR_TIME equ $4000 ;Szybkoôę migania LED'ów ROL_ERR_TIME equ $2000 ;Szybkoôę biegajâcego punktu ;---------------- Wektory w ROM ---------------- dc.l $ffff ;1 Wskaúnik stosu (na koniec ram) dc.l start ;0 Wektor startu ;----------------------------------------------- ;Biegajâcy punkt ; start: nop ;Jesteômy w trybie nadzorcy flash: move.b #%11111110,d0 ;D0 - przesowany wzór move.l #5*8,d1 ;D1 - liczba powtorzen skrola flash_loop: move.b d0,LED rol.b #1,d0 move.l #ROL_ERR_TIME,d2 ;D2 - licznik opóúnienia flash_delay: divs #1,d1 ;lepsze niű NOP dbf d2,flash_delay dbf d1,flash_loop move.l #7,d0 ;??? bra error ;??? ;----------------------------------------------- ;Sygnalizacja bîëdu na LED'ach ;we: D0 - nr bîëdu ; error: eor.b #$ff,d0 ;Negujemy (ze wzglëdu na sposób wîâczenia diod) error_loop: move.b d0,LED ;Zaôwiecenie LED'ów move.l #FLASH_ERR_TIME,d1 error_delay: divs #1,d1 ;lepsze niű NOP dbf d1,error_delay move.b #$ff,LED ;Zgaszenie LED'ów move.l #FLASH_ERR_TIME,d1 error_delay2: divs #1,d1 ;lepsze niű NOP dbf d1,error_delay2 bra error_loop ;Dodaę liczenie obiegów ; i po kilkunastu powtórzeniach ; wykonaę rozkaz RESET i skok $000000 Poczytaj komentarze, niektóre nie wymagają RAM do działania (nie używają stosu) i służą do pierwszych testów systemu. Polskie znaki w plikach w standardzie AmigaPL. Nie wiem czy przypadkiem nie ma tu prostego multikaskingu: ; Nie dajemy dyrektywy ORG $000000 bo bëdzie úle,jeôli brak dyrektywy ; to i tak kompilator skompiluje od adresu $000000 dodajâc tablicë relokacji ; adresy w rozkazach ukazane w listingu sâ nieprawdziwe. Rzeczywisty adres ; jest równy ADRES-adres dîugiego sîowa pod "dc.l stos_supervisor_str" ;DODAĘ: ;- generowanie sygnalu USER (gdy superwisor i RW=L(zapis) USER=L) ; ;- gdy USER=L i wybrany RAM superwisora nie generowaę DTACK co wywoîa ; buserror (próba zapisu ram superwisora) ;- gdy INTA blokowanie Io w górnej przestrzeni adresowej (powyűej $f00000) CAL100us equ 38 ;Licznik pëtli 100µs ;---------------- Podziaî pamiëci RAM ---------- ram equ $800000 data_user equ ram ;Poczâtek danych uűytkownika tab_char_lcd equ ram ; ;xxxx equ ram+8 ;... dane uűytkownika stos_user_end equ ram+$6000 ;koniec stosu uűytkownika stos_user_str equ ram+$8000 ;Poczâtek stosu uűytkownika data_supervisor equ ram+$8000 ;Poczâtek danych supervisora b_D0 equ data_supervisor+$000 b_D1 equ data_supervisor+$004 b_D2 equ data_supervisor+$008 b_D3 equ data_supervisor+$00C b_D4 equ data_supervisor+$010 b_D5 equ data_supervisor+$014 b_D6 equ data_supervisor+$018 b_D7 equ data_supervisor+$01C b_A0 equ data_supervisor+$020 b_A1 equ data_supervisor+$024 b_A2 equ data_supervisor+$028 b_A3 equ data_supervisor+$02C b_A4 equ data_supervisor+$030 b_A5 equ data_supervisor+$034 b_A6 equ data_supervisor+$038 b_function_code equ data_supervisor+$03C b_access_adress equ data_supervisor+$040 b_instruction_register equ data_supervisor+$044 b_status_register equ data_supervisor+$048 b_program_counter equ data_supervisor+$04C ;... dane supervisora stos_supervisor_end equ ram+$f000 ;koniec stosu supervisora stos_supervisor_str equ ram+$10000 ;Poczâtek stosu superwisora ;---------------- Staîe programu --------------- LED equ $c20000 ;Adres zatrzasku 74HCT273 KEY equ $c20001 ;Adres bramy 74HCT245 LCD_D equ $c30005 ;Adres wyôwietlacza LCD (Dane) LCD_R equ $c30001 ;Adres wyôwietlacza LCD (Rozkaz) CS1Fx equ $c00000 ;Adres IDE CS0 CS3Fx equ $c10000 ;Adres IDE CS1 FLASH_ERR_TIME equ $8000 ;Szybkoôę migania LED'ów ROL_ERR_TIME equ $1000 ;Szybkoôę biegajâcego punktu TEST_WAIT_TIME equ $8000 ;Czas wyôwietlania wyniku testu na LED'ach T equ 15 ;Bity statusu - tryb nadzorcy S equ 13 IM2 equ 10 ; maska IRQ gdy=%000 wszystkie przerwania IM1 equ 9 ; gdy=%111 tylko NMI (Level 7) IM0 equ 8 X equ 4 ;Bity statusu - tryb uűytkownika N equ 3 Z equ 2 V equ 1 C equ 0 CLS equ $0F ;Kod ASCII czyszczenia LCD POZIOM1 equ 254 ;Kod ASCII BarGraph POZIOM2 equ 253 ;Kod ASCII BarGraph POZIOM3 equ 252 ;Kod ASCII BarGraph POZIOM4 equ 251 ;Kod ASCII BarGraph STRZALKA_L equ 250 STRZALKA_P equ 249 PLAY equ 248 ;---------------- Wektory w ROM ---------------- dc.l stos_supervisor_str ;0 Wskaúnik stosu (na koniec ram) dc.l start ;1 Wektor startu ;Aby dziaîaîy stany wyjâtkowe musi byę sprawna pamiëę RAM dc.l bus_error ;2 dc.l adres_error ;3 dc.l command_error ;4 Nieistniejâca instrukcja dc.l division_error ;5 Dzielenie przez ZERO dc.l chk ;6 Instrukcja CHK <ea>,Dn dc.l trapv ;7 Instrukcja TRAPV dc.l priority_error ;8 Pogwaîcenie priorytetu dc.l trap_error ;9 ôledzenie dc.l emu1010_error ;10 dc.l emu1111_error ;11 dc.l reserved_12 ;12 dc.l reserved_13 ;13 dc.l reserved_14 ;14 dc.l init_int_error ;15 Niezaincjowany wektor przerwania dc.l reserved_16 ;16 dc.l reserved_17 ;17 dc.l reserved_18 ;18 dc.l reserved_19 ;19 dc.l reserved_20 ;20 dc.l reserved_21 ;21 dc.l reserved_22 ;22 dc.l reserved_23 ;23 dc.l false_int_error ;24 Faîszywe przerwanie dc.l int_1level ;25 Autowektor 1 poziomu dc.l int_2level ;26 Autowektor 2 poziomu dc.l int_3level ;27 Autowektor 3 poziomu dc.l int_4level ;28 Autowektor 4 poziomu dc.l int_5level ;29 Autowektor 5 poziomu dc.l int_6level ;30 Autowektor 6 poziomu dc.l int_7level ;31 Autowektor 7 poziomu dc.l trap_0 ;32 Instrukcja TRAP #0 dc.l trap_1 ;33 Instrukcja TRAP #1 dc.l trap_2 ;34 Instrukcja TRAP #2 dc.l trap_3 ;35 Instrukcja TRAP #3 dc.l trap_4 ;36 Instrukcja TRAP #4 dc.l trap_5 ;37 Instrukcja TRAP #5 dc.l trap_6 ;38 Instrukcja TRAP #6 dc.l trap_7 ;39 Instrukcja TRAP #7 dc.l trap_8 ;40 Instrukcja TRAP #8 dc.l trap_9 ;41 Instrukcja TRAP #9 dc.l trap_10 ;42 Instrukcja TRAP #10 dc.l trap_11 ;43 Instrukcja TRAP #11 dc.l trap_12 ;44 Instrukcja TRAP #12 dc.l trap_13 ;45 Instrukcja TRAP #13 dc.l trap_14 ;46 Instrukcja TRAP #14 dc.l trap_15 ;47 Instrukcja TRAP #15 dc.l reserved_48 ;48 dc.l reserved_49 ;49 dc.l reserved_50 ;50 dc.l reserved_51 ;51 dc.l reserved_52 ;52 dc.l reserved_53 ;53 dc.l reserved_54 ;54 dc.l reserved_55 ;55 dc.l reserved_56 ;56 dc.l reserved_57 ;57 dc.l reserved_58 ;58 dc.l reserved_59 ;59 dc.l reserved_60 ;60 dc.l reserved_61 ;61 dc.l reserved_62 ;62 dc.l reserved_63 ;63 dc.l user_int_64 ;64 Wektory uűytkownika (potwierdzajâce) dc.l user_int_65 ;65 dc.l user_int_66 ;66 dc.l user_int_67 ;67 dc.l user_int_68 ;68 dc.l user_int_69 ;69 dc.l user_int_70 ;70 dc.l user_int_71 ;71 dc.l user_int_72 ;72 dc.l user_int_73 ;73 dc.l user_int_74 ;74 dc.l user_int_75 ;75 dc.l user_int_76 ;76 dc.l user_int_77 ;77 dc.l user_int_78 ;78 dc.l user_int_79 ;79 dc.l user_int_80 ;80 dc.l user_int_81 ;81 dc.l user_int_82 ;82 dc.l user_int_83 ;83 dc.l user_int_84 ;84 dc.l user_int_85 ;85 dc.l user_int_86 ;86 dc.l user_int_87 ;87 dc.l user_int_88 ;88 dc.l user_int_89 ;89 dc.l user_int_90 ;90 dc.l user_int_91 ;91 dc.l user_int_92 ;92 dc.l user_int_93 ;93 dc.l user_int_94 ;94 dc.l user_int_95 ;95 dc.l user_int_96 ;96 dc.l user_int_97 ;97 dc.l user_int_98 ;98 dc.l user_int_99 ;99 dc.l user_int_100 ;100 dc.l user_int_101 ;101 dc.l user_int_102 ;102 dc.l user_int_103 ;103 dc.l user_int_104 ;104 dc.l user_int_105 ;105 dc.l user_int_106 ;106 dc.l user_int_107 ;107 dc.l user_int_108 ;108 dc.l user_int_109 ;109 dc.l user_int_110 ;110 dc.l user_int_111 ;111 dc.l user_int_112 ;112 dc.l user_int_113 ;113 dc.l user_int_114 ;114 dc.l user_int_115 ;115 dc.l user_int_116 ;116 dc.l user_int_117 ;117 dc.l user_int_118 ;118 dc.l user_int_119 ;119 dc.l user_int_120 ;120 dc.l user_int_121 ;121 dc.l user_int_122 ;122 dc.l user_int_123 ;123 dc.l user_int_124 ;124 dc.l user_int_125 ;125 dc.l user_int_126 ;126 dc.l user_int_127 ;127 dc.l user_int_128 ;128 dc.l user_int_129 ;129 dc.l user_int_130 ;130 dc.l user_int_131 ;131 dc.l user_int_132 ;132 dc.l user_int_133 ;133 dc.l user_int_134 ;134 dc.l user_int_135 ;135 dc.l user_int_136 ;136 dc.l user_int_137 ;137 dc.l user_int_138 ;138 dc.l user_int_139 ;139 dc.l user_int_140 ;140 dc.l user_int_141 ;141 dc.l user_int_142 ;142 dc.l user_int_143 ;143 dc.l user_int_144 ;144 dc.l user_int_145 ;145 dc.l user_int_146 ;146 dc.l user_int_147 ;147 dc.l user_int_148 ;148 dc.l user_int_149 ;149 dc.l user_int_150 ;150 dc.l user_int_151 ;151 dc.l user_int_152 ;152 dc.l user_int_153 ;153 dc.l user_int_154 ;154 dc.l user_int_155 ;155 dc.l user_int_156 ;156 dc.l user_int_157 ;157 dc.l user_int_158 ;158 dc.l user_int_159 ;159 dc.l user_int_160 ;160 dc.l user_int_161 ;161 dc.l user_int_162 ;162 dc.l user_int_163 ;163 dc.l user_int_164 ;164 dc.l user_int_165 ;165 dc.l user_int_166 ;166 dc.l user_int_167 ;167 dc.l user_int_168 ;168 dc.l user_int_169 ;169 dc.l user_int_170 ;170 dc.l user_int_171 ;171 dc.l user_int_172 ;172 dc.l user_int_173 ;173 dc.l user_int_174 ;174 dc.l user_int_175 ;175 dc.l user_int_176 ;176 dc.l user_int_177 ;177 dc.l user_int_178 ;178 dc.l user_int_179 ;179 dc.l user_int_180 ;180 dc.l user_int_181 ;181 dc.l user_int_182 ;182 dc.l user_int_183 ;183 dc.l user_int_184 ;184 dc.l user_int_185 ;185 dc.l user_int_186 ;186 dc.l user_int_187 ;187 dc.l user_int_188 ;188 dc.l user_int_189 ;189 dc.l user_int_190 ;190 dc.l user_int_191 ;191 dc.l user_int_192 ;192 dc.l user_int_193 ;193 dc.l user_int_194 ;194 dc.l user_int_195 ;195 dc.l user_int_196 ;196 dc.l user_int_197 ;197 dc.l user_int_198 ;198 dc.l user_int_199 ;199 dc.l user_int_200 ;200 dc.l user_int_201 ;201 dc.l user_int_202 ;202 dc.l user_int_203 ;203 dc.l user_int_204 ;204 dc.l user_int_205 ;205 dc.l user_int_206 ;206 dc.l user_int_207 ;207 dc.l user_int_208 ;208 dc.l user_int_209 ;209 dc.l user_int_210 ;210 dc.l user_int_211 ;211 dc.l user_int_212 ;212 dc.l user_int_213 ;213 dc.l user_int_214 ;214 dc.l user_int_215 ;215 dc.l user_int_216 ;216 dc.l user_int_217 ;217 dc.l user_int_218 ;218 dc.l user_int_219 ;219 dc.l user_int_220 ;220 dc.l user_int_221 ;221 dc.l user_int_222 ;222 dc.l user_int_223 ;223 dc.l user_int_224 ;224 dc.l user_int_225 ;225 dc.l user_int_226 ;226 dc.l user_int_227 ;227 dc.l user_int_228 ;228 dc.l user_int_229 ;229 dc.l user_int_230 ;230 dc.l user_int_231 ;231 dc.l user_int_232 ;232 dc.l user_int_233 ;233 dc.l user_int_234 ;234 dc.l user_int_235 ;235 dc.l user_int_236 ;236 dc.l user_int_237 ;237 dc.l user_int_238 ;238 dc.l user_int_239 ;239 dc.l user_int_240 ;240 dc.l user_int_241 ;241 dc.l user_int_242 ;242 dc.l user_int_243 ;243 dc.l user_int_244 ;244 dc.l user_int_245 ;245 dc.l user_int_246 ;246 dc.l user_int_247 ;247 dc.l user_int_248 ;248 dc.l user_int_249 ;249 dc.l user_int_250 ;250 dc.l user_int_251 ;251 dc.l user_int_252 ;252 dc.l user_int_253 ;253 dc.l user_int_254 ;254 dc.l user_int_255 ;255 ;---------------- Obsîuga bîëdów --------------- bus_error: jsr pamietaj_group0 ;Zapamiëtujemy ramkë ze stosu lea txt_bus_err,A6 ;Wyôwietlamy tekst bsr text_lcd bsr print_group0 ;Wyôwietlamy ramkë stosu moveq #2,d0 bra error_supervisor adres_error: jsr pamietaj_group0 lea txt_adress_err,A6 bsr text_lcd bsr print_group0 moveq #3,d0 bra error_supervisor command_error: jsr pamietaj_group1 ;Zapamiëtaj ramkë stosu lea txt_command_err,a6 ;Wyôwietlamy tekst bsr text_lcd bsr print_group1 ;Wyôwietlamy ramkë stosu moveq #4,d0 bra error_supervisor division_error: jsr pamietaj_group2 lea txt_division_err,a6 bsr text_lcd bsr print_group2 moveq #5,d0 bra error_supervisor chk: jsr pamietaj_group2 lea txt_chk_err,a6 bsr text_lcd bsr print_group2 moveq #6,d0 bra error_supervisor trapv: jsr pamietaj_group2 lea txt_trapv_err,a6 bsr text_lcd bsr print_group2 moveq #7,d0 bra error_supervisor priority_error: jsr pamietaj_group1 lea txt_prioryty_err,a6 bsr text_lcd bsr print_group1 moveq #8,d0 bra error_supervisor trap_error: jsr pamietaj_group2 lea txt_trap_err,a6 bsr text_lcd bsr print_group2 moveq #9,d0 bra error_supervisor emu1010_error: jsr pamietaj_group1 lea txt_emu1010_err,a6 bsr text_lcd bsr print_group1 moveq #10,d0 bra error_supervisor emu1111_error: jsr pamietaj_group1 lea txt_emu1111_err,a6 bsr text_lcd bsr print_group1 moveq #11,d0 bra error_supervisor reserved_12 moveq #12,d0 bra error_supervisor reserved_13 moveq #13,d0 bra error_supervisor reserved_14 moveq #14,d0 bra error_supervisor init_int_error: jsr pamietaj_group1 lea txt_init_int_err,a6 bsr text_lcd bsr print_group1 moveq #15,d0 bra error_supervisor reserved_16 moveq #16,d0 bra error_supervisor reserved_17 moveq #17,d0 bra error_supervisor reserved_18 moveq #18,d0 bra error_supervisor reserved_19 moveq #19,d0 bra error_supervisor reserved_20 moveq #20,d0 bra error_supervisor reserved_21 moveq #21,d0 bra error_supervisor reserved_22 moveq #22,d0 bra error_supervisor reserved_23 moveq #23,d0 bra error_supervisor false_int_error:rte ;Tu lepiej daę powrót bo ; jsr pamietaj_group1 ; czasem wystëpuje faîszywe przerwanie ; lea txt_false_int_err,a6 ; i wyîorzy caîy program, a tak ; bsr text_lcd ; ; bsr print_group1 ; moveq #24,d0 ; bra error_supervisor int_1level: jsr pamietaj_group1 lea txt_int1_err,a6 bsr text_lcd bsr print_group1 moveq #25,d0 bra error_supervisor int_2level: jsr pamietaj_group1 lea txt_int2_err,a6 bsr text_lcd bsr print_group1 moveq #26,d0 bra error_supervisor int_3level: jsr pamietaj_group1 lea txt_int3_err,a6 bsr text_lcd bsr print_group1 moveq #27,d0 bra error_supervisor int_4level: jsr pamietaj_group1 lea txt_int4_err,a6 bsr text_lcd bsr print_group1 moveq #28,d0 bra error_supervisor int_5level: jsr pamietaj_group1 lea txt_int5_err,a6 bsr text_lcd bsr print_group1 moveq #29,d0 bra error_supervisor int_6level: jsr pamietaj_group1 lea txt_int6_err,a6 bsr text_lcd bsr print_group1 moveq #30,d0 bra error_supervisor int_7level: jsr pamietaj_group1 lea txt_int7_err,a6 bsr text_lcd bsr print_group1 moveq #31,d0 bra error_supervisor trap_0: jsr pamietaj_group2 lea txt_trap0_err,a6 bsr text_lcd bsr print_group2 moveq #32,d0 bra error_supervisor trap_1: jsr pamietaj_group2 lea txt_trap1_err,a6 bsr text_lcd bsr print_group2 moveq #33,d0 bra error_supervisor trap_2: jsr pamietaj_group2 lea txt_trap2_err,a6 bsr text_lcd bsr print_group2 moveq #34,d0 bra error_supervisor trap_3: jsr pamietaj_group2 lea txt_trap3_err,a6 bsr text_lcd bsr print_group2 moveq #35,d0 bra error_supervisor trap_4: jsr pamietaj_group2 lea txt_trap4_err,a6 bsr text_lcd bsr print_group2 moveq #36,d0 bra error_supervisor trap_5: jsr pamietaj_group2 lea txt_trap5_err,a6 bsr text_lcd bsr print_group2 moveq #37,d0 bra error_supervisor trap_6: jsr pamietaj_group2 lea txt_trap6_err,a6 bsr text_lcd bsr print_group2 moveq #38,d0 bra error_supervisor trap_7: jsr pamietaj_group2 lea txt_trap7_err,a6 bsr text_lcd bsr print_group2 moveq #39,d0 bra error_supervisor trap_8: jsr pamietaj_group2 lea txt_trap8_err,a6 bsr text_lcd bsr print_group2 moveq #40,d0 bra error_supervisor trap_9: jsr pamietaj_group2 lea txt_trap9_err,a6 bsr text_lcd bsr print_group2 moveq #41,d0 bra error_supervisor trap_10: jsr pamietaj_group2 lea txt_trap10_err,a6 bsr text_lcd bsr print_group2 moveq #42,d0 bra error_supervisor trap_11: jsr pamietaj_group2 lea txt_trap11_err,a6 bsr text_lcd bsr print_group2 moveq #43,d0 bra error_supervisor trap_12: jsr pamietaj_group2 lea txt_trap12_err,a6 bsr text_lcd bsr print_group2 moveq #44,d0 bra error_supervisor trap_13: jsr pamietaj_group2 lea txt_trap13_err,a6 bsr text_lcd bsr print_group2 moveq #45,d0 bra error_supervisor trap_14: jsr pamietaj_group2 lea txt_trap14_err,a6 bsr text_lcd bsr print_group2 moveq #46,d0 bra error_supervisor ;trap_15: jsr pamietaj_group2 ; lea txt_trap15_err,a6 ; bsr text_lcd ; bsr print_group2 ; moveq #47,d0 ; bra error_supervisor reserved_48 moveq #48,d0 bra error_supervisor reserved_49 moveq #49,d0 bra error_supervisor reserved_50 moveq #50,d0 bra error_supervisor reserved_51 moveq #51,d0 bra error_supervisor reserved_52 moveq #52,d0 bra error_supervisor reserved_53 moveq #53,d0 bra error_supervisor reserved_54 moveq #54,d0 bra error_supervisor reserved_55 moveq #55,d0 bra error_supervisor reserved_56 moveq #56,d0 bra error_supervisor reserved_57 moveq #57,d0 bra error_supervisor reserved_58 moveq #58,d0 bra error_supervisor reserved_59 moveq #59,d0 bra error_supervisor reserved_60 moveq #60,d0 bra error_supervisor reserved_61 moveq #61,d0 bra error_supervisor reserved_62 moveq #62,d0 bra error_supervisor reserved_63 moveq #63,d0 bra error_supervisor user_int_64 moveq #64,d0 bra error_supervisor user_int_65 moveq #65,d0 bra error_supervisor user_int_66 moveq #66,d0 bra error_supervisor user_int_67 moveq #67,d0 bra error_supervisor user_int_68 moveq #68,d0 bra error_supervisor user_int_69 moveq #69,d0 bra error_supervisor user_int_70 moveq #70,d0 bra error_supervisor user_int_71 moveq #71,d0 bra error_supervisor user_int_72 moveq #72,d0 bra error_supervisor user_int_73 moveq #73,d0 bra error_supervisor user_int_74 moveq #74,d0 bra error_supervisor user_int_75 moveq #75,d0 bra error_supervisor user_int_76 moveq #76,d0 bra error_supervisor user_int_77 moveq #77,d0 bra error_supervisor user_int_78 moveq #78,d0 bra error_supervisor user_int_79 moveq #79,d0 bra error_supervisor user_int_80 moveq #80,d0 bra error_supervisor user_int_81 moveq #81,d0 bra error_supervisor user_int_82 moveq #82,d0 bra error_supervisor user_int_83 moveq #83,d0 bra error_supervisor user_int_84 moveq #84,d0 bra error_supervisor user_int_85 moveq #85,d0 bra error_supervisor user_int_86 moveq #86,d0 bra error_supervisor user_int_87 moveq #87,d0 bra error_supervisor user_int_88 moveq #88,d0 bra error_supervisor user_int_89 moveq #89,d0 bra error_supervisor user_int_90 moveq #90,d0 bra error_supervisor user_int_91 moveq #91,d0 bra error_supervisor user_int_92 moveq #92,d0 bra error_supervisor user_int_93 moveq #93,d0 bra error_supervisor user_int_94 moveq #94,d0 bra error_supervisor user_int_95 moveq #95,d0 bra error_supervisor user_int_96 moveq #96,d0 bra error_supervisor user_int_97 moveq #97,d0 bra error_supervisor user_int_98 moveq #98,d0 bra error_supervisor user_int_99 moveq #99,d0 bra error_supervisor user_int_100 moveq #100,d0 bra error_supervisor user_int_101 moveq #101,d0 bra error_supervisor user_int_102 moveq #102,d0 bra error_supervisor user_int_103 moveq #103,d0 bra error_supervisor user_int_104 moveq #104,d0 bra error_supervisor user_int_105 moveq #105,d0 bra error_supervisor user_int_106 moveq #106,d0 bra error_supervisor user_int_107 moveq #107,d0 bra error_supervisor user_int_108 moveq #108,d0 bra error_supervisor user_int_109 moveq #109,d0 bra error_supervisor user_int_110 moveq #110,d0 bra error_supervisor user_int_111 moveq #111,d0 bra error_supervisor user_int_112 moveq #112,d0 bra error_supervisor user_int_113 moveq #113,d0 bra error_supervisor user_int_114 moveq #114,d0 bra error_supervisor user_int_115 moveq #115,d0 bra error_supervisor user_int_116 moveq #116,d0 bra error_supervisor user_int_117 moveq #117,d0 bra error_supervisor user_int_118 moveq #118,d0 bra error_supervisor user_int_119 moveq #119,d0 bra error_supervisor user_int_120 moveq #120,d0 bra error_supervisor user_int_121 moveq #121,d0 bra error_supervisor user_int_122 moveq #122,d0 bra error_supervisor user_int_123 moveq #123,d0 bra error_supervisor user_int_124 moveq #124,d0 bra error_supervisor user_int_125 moveq #125,d0 bra error_supervisor user_int_126 moveq #126,d0 bra error_supervisor user_int_127 moveq #127,d0 bra error_supervisor user_int_128 move.b #128,d0 bra error_supervisor user_int_129 move.b #129,d0 bra error_supervisor user_int_130 move.b #130,d0 bra error_supervisor user_int_131 move.b #131,d0 bra error_supervisor user_int_132 move.b #132,d0 bra error_supervisor user_int_133 move.b #133,d0 bra error_supervisor user_int_134 move.b #134,d0 bra error_supervisor user_int_135 move.b #135,d0 bra error_supervisor user_int_136 move.b #136,d0 bra error_supervisor user_int_137 move.b #137,d0 bra error_supervisor user_int_138 move.b #138,d0 bra error_supervisor user_int_139 move.b #139,d0 bra error_supervisor user_int_140 move.b #140,d0 bra error_supervisor user_int_141 move.b #141,d0 bra error_supervisor user_int_142 move.b #142,d0 bra error_supervisor user_int_143 move.b #143,d0 bra error_supervisor user_int_144 move.b #144,d0 bra error_supervisor user_int_145 move.b #145,d0 bra error_supervisor user_int_146 move.b #146,d0 bra error_supervisor user_int_147 move.b #147,d0 bra error_supervisor user_int_148 move.b #148,d0 bra error_supervisor user_int_149 move.b #149,d0 bra error_supervisor user_int_150 move.b #150,d0 bra error_supervisor user_int_151 move.b #151,d0 bra error_supervisor user_int_152 move.b #152,d0 bra error_supervisor user_int_153 move.b #153,d0 bra error_supervisor user_int_154 move.b #154,d0 bra error_supervisor user_int_155 move.b #155,d0 bra error_supervisor user_int_156 move.b #156,d0 bra error_supervisor user_int_157 move.b #157,d0 bra error_supervisor user_int_158 move.b #158,d0 bra error_supervisor user_int_159 move.b #159,d0 bra error_supervisor user_int_160 move.b #160,d0 bra error_supervisor user_int_161 move.b #161,d0 bra error_supervisor user_int_162 move.b #162,d0 bra error_supervisor user_int_163 move.b #163,d0 bra error_supervisor user_int_164 move.b #164,d0 bra error_supervisor user_int_165 move.b #165,d0 bra error_supervisor user_int_166 move.b #166,d0 bra error_supervisor user_int_167 move.b #167,d0 bra error_supervisor user_int_168 move.b #168,d0 bra error_supervisor user_int_169 move.b #169,d0 bra error_supervisor user_int_170 move.b #170,d0 bra error_supervisor user_int_171 move.b #171,d0 bra error_supervisor user_int_172 move.b #172,d0 bra error_supervisor user_int_173 move.b #173,d0 bra error_supervisor user_int_174 move.b #174,d0 bra error_supervisor user_int_175 move.b #175,d0 bra error_supervisor user_int_176 move.b #176,d0 bra error_supervisor user_int_177 move.b #177,d0 bra error_supervisor user_int_178 move.b #178,d0 bra error_supervisor user_int_179 move.b #179,d0 bra error_supervisor user_int_180 move.b #180,d0 bra error_supervisor user_int_181 move.b #181,d0 bra error_supervisor user_int_182 move.b #182,d0 bra error_supervisor user_int_183 move.b #183,d0 bra error_supervisor user_int_184 move.b #184,d0 bra error_supervisor user_int_185 move.b #185,d0 bra error_supervisor user_int_186 move.b #186,d0 bra error_supervisor user_int_187 move.b #187,d0 bra error_supervisor user_int_188 move.b #188,d0 bra error_supervisor user_int_189 move.b #189,d0 bra error_supervisor user_int_190 move.b #190,d0 bra error_supervisor user_int_191 move.b #191,d0 bra error_supervisor user_int_192 move.b #192,d0 bra error_supervisor user_int_193 move.b #193,d0 bra error_supervisor user_int_194 move.b #194,d0 bra error_supervisor user_int_195 move.b #195,d0 bra error_supervisor user_int_196 move.b #196,d0 bra error_supervisor user_int_197 move.b #197,d0 bra error_supervisor user_int_198 move.b #198,d0 bra error_supervisor user_int_199 move.b #199,d0 bra error_supervisor user_int_200 move.b #200,d0 bra error_supervisor user_int_201 move.b #201,d0 bra error_supervisor user_int_202 move.b #202,d0 bra error_supervisor user_int_203 move.b #203,d0 bra error_supervisor user_int_204 move.b #204,d0 bra error_supervisor user_int_205 move.b #205,d0 bra error_supervisor user_int_206 move.b #206,d0 bra error_supervisor user_int_207 move.b #207,d0 bra error_supervisor user_int_208 move.b #208,d0 bra error_supervisor user_int_209 move.b #209,d0 bra error_supervisor user_int_210 move.b #210,d0 bra error_supervisor user_int_211 move.b #211,d0 bra error_supervisor user_int_212 move.b #212,d0 bra error_supervisor user_int_213 move.b #213,d0 bra error_supervisor user_int_214 move.b #214,d0 bra error_supervisor user_int_215 move.b #215,d0 bra error_supervisor user_int_216 move.b #216,d0 bra error_supervisor user_int_217 move.b #217,d0 bra error_supervisor user_int_218 move.b #218,d0 bra error_supervisor user_int_219 move.b #219,d0 bra error_supervisor user_int_220 move.b #220,d0 bra error_supervisor user_int_221 move.b #221,d0 bra error_supervisor user_int_222 move.b #222,d0 bra error_supervisor user_int_223 move.b #223,d0 bra error_supervisor user_int_224 move.b #224,d0 bra error_supervisor user_int_225 move.b #225,d0 bra error_supervisor user_int_226 move.b #226,d0 bra error_supervisor user_int_227 move.b #227,d0 bra error_supervisor user_int_228 move.b #228,d0 bra error_supervisor user_int_229 move.b #229,d0 bra error_supervisor user_int_230 move.b #230,d0 bra error_supervisor user_int_231 move.b #231,d0 bra error_supervisor user_int_232 move.b #232,d0 bra error_supervisor user_int_233 move.b #233,d0 bra error_supervisor user_int_234 move.b #234,d0 bra error_supervisor user_int_235 move.b #235,d0 bra error_supervisor user_int_236 move.b #236,d0 bra error_supervisor user_int_237 move.b #237,d0 bra error_supervisor user_int_238 move.b #238,d0 bra error_supervisor user_int_239 move.b #239,d0 bra error_supervisor user_int_240 move.b #240,d0 bra error_supervisor user_int_241 move.b #241,d0 bra error_supervisor user_int_242 move.b #242,d0 bra error_supervisor user_int_243 move.b #243,d0 bra error_supervisor user_int_244 move.b #244,d0 bra error_supervisor user_int_245 move.b #245,d0 bra error_supervisor user_int_246 move.b #246,d0 bra error_supervisor user_int_247 move.b #247,d0 bra error_supervisor user_int_248 move.b #248,d0 bra error_supervisor user_int_249 move.b #249,d0 bra error_supervisor user_int_250 move.b #250,d0 bra error_supervisor user_int_251 move.b #251,d0 bra error_supervisor user_int_252 move.b #252,d0 bra error_supervisor user_int_253 move.b #253,d0 bra error_supervisor user_int_254 move.b #254,d0 bra error_supervisor user_int_255 move.b #255,d0 bra error_supervisor ;----------------------------------------------- ;Zapamiëtuje zawartoôę rejestrów w zmiennych ; pamietaj_rejestry: move.l D0,b_D0 move.l D1,b_D1 move.l D2,b_D2 move.l D3,b_D3 move.l D4,b_D4 move.l D5,b_D5 move.l D6,b_D6 move.l D7,b_D7 move.l A0,b_A0 move.l A1,b_A1 move.l A2,b_A2 move.l A3,b_A3 move.l A4,b_A4 move.l A5,b_A5 move.l A6,b_A6 rts ;----------------------------------------------- ;Zapamiëtuje ramkë stosu (str. 6-17 68000 Microprocessors User's Manual) ; Wskaúnik zmieniono o +4 poniewaű wykonano podprogram (stos -4) ; pamietaj_group0:bsr pamietaj_rejestry move.w 0+4(A7),b_function_code move.l 2+4(A7),b_access_adress move.w 6+4(A7),b_instruction_register move.w 8+4(A7),b_status_register move.l 10+4(A7),b_program_counter rts ;----------------------------------------------- ;Zapamiëtuje ramkë stosu (str. 6-10 68000 Microprocessors User's Manual) ; Wskaúnik zmieniono o +4 poniewaű wykonano podprogram (stos -4) ; pamietaj_group2: pamietaj_group1:bsr pamietaj_rejestry move.w 0+4(A7),b_status_register move.l 2+4(A7),b_program_counter rts ;----------------------------------------------- ;Wyôwietla liczniki, status, itp zapamiëtane w RAM ; print_group2: print_group1: lea txt_pc,A6 ;napis bsr text_lcd move.l b_program_counter,D0 ;Wyôwietlamy PC bsr long_lcd lea txt_sr,A6 ;Napis bsr text_lcd move.l b_status_register,D0 ;Wyôwietlamy Status register bsr word_lcd lea txt_Dx,A6 ;napis bsr text_lcd move.l b_D0,D0 ;wyô wartoôę rejestru bsr long_lcd lea txt_Ax,A6 ;napis bsr text_lcd move.l b_A5,D0 ;wyô wartoôę rejestru bsr long_lcd bsr spc_lcd ;spacja move.l b_A6,D0 ;wyô wartoôę rejestru bsr long_lcd rts ;----------------------------------------------- ;Wyôwietla liczniki, status, itp zapamiëtane w RAM ; print_group0: lea txt_pc,A6 ;napis bsr text_lcd move.l b_program_counter,D0 ;Wyôwietlamy PC bsr long_lcd lea txt_sr,A6 ;Napis bsr text_lcd move.l b_status_register,D0 ;Wyôwietlamy Status register bsr word_lcd lea txt_asccess,A6 ;Napis bsr text_lcd move.l b_access_adress,D0 ;Wyôwietlamy adres bsr long_lcd lea txt_fcode,A6 ;Napis bsr text_lcd move.b b_function_code,D0 ;wyôwietlamy function code bsr hex_lcd rts ;=============================================== ;Sygnalizacja bîëdu na LED'ach w trybie nadzorcy ;we: D0 - nr bîëdu ; error_supervisor: ; eor.b #$ff,d0 ;Negujemy (ze wzglëdu na sposób wîâczenia diod) moveq #10,d2 ;D2 - liczba powtórzeď FLASHA error_loop: move.b d0,LED ;Zaôwiecenie LED'ów move.l #FLASH_ERR_TIME,d1 ;D1 - Pëtla opóúniajâca error_delay: divs #1,d0 ;NOP dbf d1,error_delay move.b #$00,LED ;Zgaszenie LED'ów move.l #FLASH_ERR_TIME,d1 ;D1 - Pëtla opóúniajâca error_delay2: divs #1,d0 ;NOP dbf d1,error_delay2 dbf d2,error_loop ;Dodaę liczenie obiegów ;??? reset ;Choę tryb nadzorcy to wywoîuje ; bîâd nieistniejâca instrukcja (wektor 4) jmp start ;----------------------------------------------- ;Wykorzystane do przejôcia w tryb nadzorcy i wykonania podprogramu uűytkownika ; zawierajâcego rozkazy dla trybu nadzorcy ;we: A6 - adres procedury zakoďczonej rozkazem RTS ; supervisor: trap #15 ;Wywoîuje stan wyjâtkowy i skok do "trap_15" rts ; wracamy z podprogramu trap_15: jsr (a6) ;Skaczemy do podprogramu rte ; wracamy z przerwania ;=============================================== ;Biegajâcy punkt sygnalizujâcy poprawnâ pracë CPU i ROM ; Jesteômy w trybie nadzorcy start: move.b #%00000001,d0 ;D0 - przesówany wzór moveq #3*8-1,d2 ;D2 - liczba powtorzeď skrola flash_loop: move.b d0,LED rol.b #1,d0 move.l #ROL_ERR_TIME,d1 ;D1 - licznik opóúnienia flash_delay: divs #1,d0 ;NOP dbf d1,flash_delay dbf d2,flash_loop move.b #%00000001,D7 ;D7 - wyniki testów (LED1 - CPU OK) move.b D7,LED move.l #TEST_WAIT_TIME,d1 ;D1 - Pëtla opóúniajâca test0_delay: divs #1,d0 ;NOP dbf d1,test0_delay ;Sprawdzenie sumy kontrolnej ROM bset #1,D7 ;LED2 - CHECKSUM ROM OK move.b D7,LED move.l #TEST_WAIT_TIME,d1 ;D1 - Pëtla opóúniajâca test1_delay: divs #1,d0 ;NOP dbf d1,test1_delay ;Sprawdzenie RAM parzystego lea data_user,A0 ;Adres RAM do A0 move.b #$aa,(A0) ; zapis i odczyt RAM parzytego cmpi.b #$aa,(A0) bne test2_fail move.b #$55,(A0) cmpi.b #$55,(A0) bne test2_fail bset #2,D7 ;LED3 - RAM OK move.b D7,LED move.l #TEST_WAIT_TIME,d1 ;D1 - Pëtla opóúniajâca test2_delay: divs #1,d0 ;NOP dbf d1,test2_delay test2_fail: ;Sprawdzenie RAM nieparzystego lea data_user+1,A0 ;Adres RAM do A0 move.b #$aa,(A0) ; zapis i odczyt RAM nieparzytego cmpi.b #$aa,(A0) bne test3_fail move.b #$55,(A0) cmpi.b #$55,(A0) bne test3_fail bset #3,d7 ;LED4 - RAM OK move.b D7,LED move.l #TEST_WAIT_TIME,d1 ;D1 - Pëtla opóúniajâca test3_delay: divs #1,d0 ;NOP dbf d1,test3_delay test3_fail: ;Sprawdzenie RAM parzystego i nieparzystego lea data_user,A0 ;Adres RAM do A0 move.l #$aaaaffff,(A0) ; zapis i odczyt RAM nieparzytego cmpi.l #$aaaaffff,(A0) bne test4_fail move.l #$55550000,(A0) cmpi.l #$55550000,(A0) bne test4_fail bset #4,d7 ;LED5 - RAM OK move.b D7,LED move.l #TEST_WAIT_TIME,d1 ;D1 - Pëtla opóúniajâca test4_delay: divs #1,d0 ;NOP dbf d1,test4_delay test4_fail: ;Sprawdzenie wyôwietlacza LCD bsr init_lcd ;Inicjalizacja (jeôli jest) move.b #0,D0 ;Ustaw kursor bsr kursor_lcd bsr wait_busy_lcd ;Odczytanie znaku z LCD cmpi.b #" ",LCD_D ;jeôli spacja to OK bne test5_fail bset #5,d7 ;LED6 - LCD OK move.b D7,LED move.l #TEST_WAIT_TIME,d1 ;D1 - Pëtla opóúniajâca test5_delay: divs #1,d0 ;NOP dbf d1,test5_delay test5_fail: bset #6,d7 ;LED7 - move.b D7,LED move.l #TEST_WAIT_TIME,d1 ;D1 - Pëtla opóúniajâca test6_delay: divs #1,d0 ;NOP dbf d1,test6_delay bset #7,d7 ;LED8 - move.b D7,LED move.l #TEST_WAIT_TIME,d1 ;D1 - Pëtla opóúniajâca test7_delay: divs #1,d0 ;NOP dbf d1,test7_delay ;Koniec testów move.l #TEST_WAIT_TIME,d1 ;D1 - Pëtla opóúniajâca test8_delay: divs #1,d0 ;NOP divs #1,d0 divs #1,d0 dbf d1,test8_delay move.b #$00,LED ;Wyîâczenie wszystkich LED ;================ Tryb uűytkownika ============= ; iii ; T.S..210...XNZVC ; move.w #%0000000000000000,SR ;Tryb uűytkownika, wîâczone wszystkie przerwania ; lea stos_user_str,a7 ;Ustawienie stosu urzytkownika ; bsr init_lcd ;inicjalizacja LCD ; lea tekst,A6 ;Wyôwietlenie tekstu ; bsr text_lcd loopL: move.b LCD_D,D0 move.b D0,LED jmp loopL ;----------------------------------------------- migaj: ; eor.b #$ff,d0 ;Negujemy (ze wzglëdu na sposób wîâczenia diod) moveq #10,d2 ;D2 - liczba powtórzeď FLASHA migaj_loop: move.b d0,LED ;Zaôwiecenie LED'ów move.l #FLASH_ERR_TIME,d1 ;D1 - Pëtla opóúniajâca migaj_delay: divs #1,d0 ;NOP dbf d1,migaj_delay move.b #$00,LED ;Zgaszenie LED'ów move.l #FLASH_ERR_TIME,d1 ;D1 - Pëtla opóúniajâca migaj_delay2: divs #1,d0 ;NOP dbf d1,migaj_delay2 dbf d2,migaj_loop ;Dodaę liczenie obiegów ; dc.w $ffff ;Dziaîa - emulator linii F ; dc.w $afff ;Dziaîa - emulator linii A ; divs #0,D0 ;Dziaîa - daje stan wyjâtkowy ; move.w D0,SR ;Dziaîa - naruszenie uprzywilejowania ; trap #5 ;Dziaîa - póîîapka ; move.b $d00000,d0 ;Dziaîa - BusError (nieistniejâcy obszar) ; move.b #0,$000004 ;Dizaîa - BusError (próba zapisu ROM) ; move.b $810000,d0 ;Dziaîa - BusError (przekroczenie ram) ; jmp $12345678 ;Dziaîa - BusError (przekroczenie rom) lea przywilej,a6 ;Wykonanie fragmentu uprzywilejowanego jsr supervisor lea migaj_end,a6 ;Adres programu jsr supervisor ;Od tego momentu wykonujemy tryb nadzorcy migaj_end: move.w SR,D0 move.w D0,SR jmp start przywilej: move.w SR,D0 move.w D0,SR move.b #$f0,LED rts skok: jsr skok2 rts skok2: nop rts ;----------------------------------------------- ;Inicjalizuje wyôwietlacz LCD ; ;??? jak zadziala zastâpię ,LCD_R przez ROZKAZ(A6) - w A6 adres bazy LCD ; init_lcd: move.w #150,d1 ;Wait 15ms bsr delay_100us lea LCD_R,A6 move.b #%00110000,(A6) ;Functiom Set move.w #50,d1 ;Wait 5ms bsr delay_100us move.b #%00110000,(A6) ;Functiom Set move.w #2,d1 ;Wait 200us bsr delay_100us move.b #%00110000,(A6) ;Functiom Set move.b #%00111000,d0 ;szyna 8-bit, 2 linie, znaki 5*7 bsr rozkaz_lcd move.b #%00001000,d0 ;Display OFF bsr rozkaz_lcd move.b #%00000001,d0 ;Clear displey bsr rozkaz_lcd move.b #%00000110,d0 ;Entry mode set bsr rozkaz_lcd move.b #%00001111,d0 ;Display ON bsr rozkaz_lcd ;move.b #%01000000,d0 ;Poczâtek generatora znaków ;bsr rozkaz_lcd ;move.l #63,D6 ;D6 - liczba bajtów do skopiowania ;lea polskie_znaki,A6 ;A6 - adres znakow w ROM init_lcd_l1: ;bsr wait_busy_lcd ;move.b (A6)+,LCD_D ;Niemoűe byę "print_lcd" ponieaű filtruje znaki ;dbf D6,init_lcd_l1 ;move.b #%00000001,d0 ;Clear displey ;bsr rozkaz_lcd bsr clear_tab_lcd ;Czyôę tablicë znaków dynamicznych rts ;----------------------------------------------- ;Czyôci tablicë TAB_CHAR_ASCII ; clear_tab_lcd: movem.l D0/A6,-(A7) ;rejestry na stos move.l #7,D0 ;Liczba znaków w TAB_CHAR_LCD lea tab_char_lcd,A6 ;adres tablicy do A5 init_lcd_l2: move.b #0,(A6)+ ;Zerowanie tablicy TAB_CHAR_LCD dbf D0,init_lcd_l2 movem.l (A7)+,D0/A6 ;rejestry ze stosu rts ;----------------------------------------------- ;Wysyîa znak z rejestru D0 do pamiëci danych LCD ; przeprowadza konwersjë polskich znaków i akceptuje kody sterujâce ; typu: czyszczenie wyôwietlacza, kursor w poîoűenie spoczynkowe, itp ;we: D0.b - znak do wysîania ;wy: -- ;zm: -- ; print_lcd: cmpi.b #CLS,D0 ;Czy kod sterujâcy ? beq cls_lcd ; movem.l D0/A6,-(a7) ;rejestry na stos ; lea tab_konw_pl,a6 ;print_lcd_l2: cmp.b (A6)+,D0 ;czy znak do skonwertowania ? ; beq print_lcd_l1 ; - tak wiëc kowertuj ; cmpa.l #tab_konw_pl+9,A6 ;czy koniec tablicy konwersji ; bne print_lcd_l2 ; - nie wiëc pëtla ; bra print_lcd_l3 ; - tak wiëc skok do drukowania znaku ;print_lcd_l1: move.b 8(A6),D0 ;pobranie skonwerowanego znaku ;print_lcd_l3: bsr wait_busy_lcd ; move.b D0,LCD_D ; movem.l (a7)+,D0/A6 ;rejestry ze stosu ; rts ; ;tab_konw_pl: DC.B "â","ę","ë","î","ď","ó","ô","ű","ú" ; DC.B 08, 01, 02, 03, 04, 05, 06, 07, 07 movem.l D0-D3/A5-A6,-(a7) ;rejestry na stos ;------- Czy znak konwertowaę (nie ma w ROM LCD) --- lea tab_specjalne_lcd,a6 ;adres tablicy znaków do konwertowania print_lcd_l2: cmp.b (A6),D0 ;czy znak do skonwertowania ? beq print_lcd_l1 ; - tak wiëc kowertuj adda.l #1,A6 ; - nie wiëc next kod cmpa.l #tab_alternatywne_lcd,A6 ;czy koniec tablicy konwersji bne print_lcd_l2 ; - nie wiëc pëtla bra print_lcd_l3 ; - tak wiëc skok do drukowania znaku bez zmian ;------- Czy znak jest juű w TAB_CHAR_LCD czyli takűe w pamiëci LCD --- print_lcd_l1: move.l #7,D1 ;Liczba znaków w TAB_CHAR_LCD lea tab_char_lcd,A5 ;adres TAB_CHAR_LCD do A5 print_lcd_l5: cmp.b (A5),D0 ;czy znak jest juű w TAB_CHAR_LCD beq print_lcd_l4 ; - tak wiëc drukuj zgodnie ze znalezionym kodem adda.l #1,A5 ; - nie wiëc next kod dbf D1,print_lcd_l5 ;jeôli nie koniec tablicy to skok ;------- Czy sâ wolne miejsca w TAB_CHAR_LCD --- move.l #7,D1 ;Liczba znaków w TAB_CHAR_LCD lea tab_char_lcd,A5 ;adres TAB_CHAR_LCD do A5 print_lcd_l7: cmpi.b #0,(A5) ;Czy jest wolny kod w TAB_CHAR_LCD beq print_lcd_l6 ; - tak wiëc wyôlij wzór adda.l #1,A5 ; - nie wiëc next kod dbf D1,print_lcd_l7 ;jeôli nie koniec tablicy to skok ;------- Nie da sië przesîaę wzoru znaku wiëc podstaw alternatywny --- adda.l #tab_alternatywne_lcd-tab_specjalne_lcd,A6 move.b (A6),D0 bra print_lcd_l3 ;------- Wpisz kod znaku do TAB_CHAR_LCD i wyôlij wzór znaku do RAM LCD --- ;D0 - kod znaku ;A6 - adres znaku w tab_specjalne_lcd ;A5 - adres kodu znaku w TAB_CHAR_LCD print_lcd_l6: move.b D0,(A5) ;Kod znaku do TAB_CHAR_LCD suba.l #tab_specjalne_lcd,A6 ;Obliczenie nr wzoru znaku move.l A6,D1 ;nr wzoru do D1 rol #3,D1 ;i monoűymy przez 8 (liczba bajtów znaku) lea polskie_znaki,A6 ;A6 - adres wzorów znaków adda.l D1,A6 ;dodajemy do obliczonego ofsetu bsr wait_busy_lcd ;Odczyt pozycji kursora move.b LCD_R,D2 ; i zapamiëtanie w D2 move.l A5,D0 ;Obliczenie nr znaku w RAM LCD sub.l #tab_char_lcd,D0 rol #3,D0 ;monoűymy przez 8 (liczba bajtów znaku) or.b #%01000000,d0 ;Adres generatora znaków w LCD bsr rozkaz_lcd move.l #7,D6 ;D6 - liczba bajtów do skopiowania print_lcd_l8: bsr wait_busy_lcd ;kopiowanie wzoru znaku do RAM LCD move.b (A6)+,LCD_D ;Nie moűe byę "print_lcd" ponieaű filtruje znaki dbf D6,print_lcd_l8 move.b D2,D0 ;Odtworzenie pozycji kursora bsr kursor_lcd ; i ustawienie go ;------- Wysîanie znaku o kodzie w A5 (z tablicy TAB_CHAR_LCD) --- print_lcd_l4: suba.l #tab_char_lcd,A5 ;Obliczenie nr znaku w RAM LCD move.l A5,D0 ;wynik do D0 ;------- Drukowanie kodu z D0 na LCD --- print_lcd_l3: bsr wait_busy_lcd ;Drukowanie na LCD kodu z D0 move.b D0,LCD_D movem.l (a7)+,D0-D3/A5-A6 ;rejestry ze stosu rts tab_specjalne_lcd: DC.B "â","ę","ë","î","ď","ó","ô","ű","ú" DC.B "Â","Ę","Ë","Î","Ď","Ó","Ô","Ű","Ú" DC.B POZIOM1,POZIOM2,POZIOM3,POZIOM4 DC.B STRZALKA_L,STRZALKA_P,PLAY tab_alternatywne_lcd: DC.B "a","c","e","l","n","o","s","z","z" DC.B "A","C","E","L","N","O","S","Z","Z" DC.B $20,$20,$ff,$ff DC.B "<",">",">" ;------- Kolejnoôę kodów musi byę taka sama jak w tablicy "tab_specjalne_lcd" polskie_znaki: DC.B %00000 ; â DC.B %00000 DC.B %01110 DC.B %00001 DC.B %01111 DC.B %10001 DC.B %01111 DC.B %00010 DC.B %00010 ; ę DC.B %00100 DC.B %01110 DC.B %10000 DC.B %10000 DC.B %10001 DC.B %01110 DC.B %00000 DC.B %00000 ; ë DC.B %00000 DC.B %01110 DC.B %10001 DC.B %11111 DC.B %10000 DC.B %01110 DC.B %00010 DC.B %11000 ; î DC.B %01000 DC.B %01100 DC.B %01000 DC.B %11000 DC.B %01000 DC.B %11100 DC.B %00000 DC.B %00010 ; ď DC.B %00100 DC.B %10110 DC.B %11001 DC.B %10001 DC.B %10001 DC.B %10001 DC.B %00000 DC.B %00010 ; ó DC.B %00100 DC.B %01110 DC.B %10001 DC.B %10001 DC.B %10001 DC.B %01110 DC.B %00000 DC.B %00010 ; ô DC.B %00100 DC.B %01110 DC.B %10000 DC.B %01110 DC.B %00001 DC.B %11110 DC.B %00000 DC.B %00000 ; ű DC.B %00000 DC.B %11111 DC.B %00010 DC.B %01110 DC.B %01000 DC.B %11111 DC.B %00000 DC.B %00110 ; ú DC.B %00000 DC.B %11111 DC.B %00010 DC.B %00100 DC.B %01000 DC.B %11111 DC.B %00000 DC.B %01110 ; Â DC.B %10001 DC.B %10001 DC.B %10001 DC.B %11111 DC.B %10001 DC.B %10001 DC.B %00010 DC.B %00010 ; Ę DC.B %01111 DC.B %10101 DC.B %10000 DC.B %10000 DC.B %10001 DC.B %01110 DC.B %00000 DC.B %11111 ; Ë DC.B %10000 DC.B %10000 DC.B %11110 DC.B %10000 DC.B %10000 DC.B %11111 DC.B %00010 DC.B %10000 ; Î DC.B %10000 DC.B %10100 DC.B %11000 DC.B %10000 DC.B %10000 DC.B %11111 DC.B %00000 DC.B %10101 ; Ď DC.B %10001 DC.B %11001 DC.B %10101 DC.B %10011 DC.B %10001 DC.B %10001 DC.B %00000 DC.B %00010 ; Ó DC.B %01110 DC.B %10101 DC.B %10001 DC.B %10001 DC.B %10001 DC.B %01110 DC.B %00000 DC.B %00010 ; Ô DC.B %01110 DC.B %10101 DC.B %10000 DC.B %01110 DC.B %00001 DC.B %11110 DC.B %00000 DC.B %11111 ; Ű DC.B %00001 DC.B %00001 DC.B %00010 DC.B %01110 DC.B %01000 DC.B %11111 DC.B %00000 DC.B %00100 ; Ú DC.B %11111 DC.B %01001 DC.B %00010 DC.B %00100 DC.B %01000 DC.B %11111 DC.B %00000 DC.B %10000 ; Poziom1 DC.B %10000 DC.B %10000 DC.B %10000 DC.B %10000 DC.B %10000 DC.B %10000 DC.B %10000 DC.B %11000 ; Poziom2 DC.B %11000 DC.B %11000 DC.B %11000 DC.B %11000 DC.B %11000 DC.B %11000 DC.B %11000 DC.B %11100 ; Poziom3 DC.B %11100 DC.B %11100 DC.B %11100 DC.B %11100 DC.B %11100 DC.B %11100 DC.B %11100 DC.B %11110 ; Poziom4 DC.B %11110 DC.B %11110 DC.B %11110 DC.B %11110 DC.B %11110 DC.B %11110 DC.B %11110 DC.B %00010 ; Sprzaîka Lewo DC.B %00100 DC.B %01100 DC.B %11111 DC.B %01100 DC.B %00100 DC.B %00010 DC.B %00000 DC.B %01000 ; Sprzaîka Prawo DC.B %00100 DC.B %00110 DC.B %11111 DC.B %00110 DC.B %00100 DC.B %01000 DC.B %00000 DC.B %01000 ; Play DC.B %01100 DC.B %01110 DC.B %01111 DC.B %01110 DC.B %01100 DC.B %01000 DC.B %00000 ;----------------------------------------------- ;Wysyîa dîugiesîowo jako osiem znaków HexASCII na LCD ;we: D0.l - sîowo do wyôwietlenia ;wy: -- ;zm: -- ; long_lcd: movem.l D0,-(A7) ;rejestry na stos movem.l D0,-(A7) ;zapamiëtanie D0 lsr.l #8,D0 ;wybranie starszego sîowa lsr.l #8,D0 bsr word_lcd ;na LCD movem.l (A7)+,D0 ;odtworzenie D0 bsr word_lcd ;Mîodsze sîowo na LCD movem.l (A7)+,D0 ;rejestry ze stosu rts ;----------------------------------------------- ;Wysyîa sîowo jako cztery znaki HexASCII na LCD ;we: D0.w - sîowo do wyôwietlenia ;wy: -- ;zm: -- ; word_lcd: movem.l D0,-(A7) ;rejestry na stos movem.w D0,-(A7) ;zapamiëtanie D0 lsr.w #8,D0 ;wybranie starszego bajtu bsr hex_lcd ;na LCD movem.w (A7)+,D0 ;odtworzenie D0 bsr hex_lcd ;Mîodszy bajt na LCD movem.l (A7)+,D0 ;rejestry ze stosu rts ;----------------------------------------------- ;Wysyîa bajt jako dwa znaki w HexASCII na LCD ;we: D0.b - bajt do wyôwietlenia ;wy: -- ;zm: -- ; hex_lcd: movem.l D0,-(A7) ;rejestry na stos movem.w D0,-(A7) ;zapamiëtanie D0 lsr.b #4,D0 ;wybranie starszego nibla bsr nible_lcd ;na LCD movem.w (A7)+,D0 ;odtworzenie D0 bsr nible_lcd ;mîodzy nible na LCD movem.l (A7)+,D0 ;rejestry ze stosu rts ;----------------------------------------------- ;Wysyîa nible w HexASCII na LCD ;we: D0.b - bajt do wyôwietlenia ;wy: -- ;zm: -- ; nible_lcd: movem.l D0/A6,-(A7) ;rejestry na stos lea tab_hex,A6 ;adres tablicy konwersji andi.w #$0F,D0 ;tylko mîodszy póîbajt move.b 0(A6,D0.w),D0 ;pobranie z tabliwy bsr print_lcd ;na LCD movem.l (A7)+,D0/A6 ;rejestry ze stosu rts tab_hex: DC.B '0123456789ABCDEF' ;----------------------------------------------- ;Wysyîa tekst wskazywany przez A6 do pamiëci danych LCD ;we: A6.l - adres tekstu ;wy: -- ;zm: A6 ; text_lcd: movem.l D0,-(a7) ;rejestry na stoso text_lcd_l1: move.b (A6)+,D0 ;Dana do D0 beq text_lcd_quit ;jeôli #0 to koniec bsr print_lcd ;wyôlij znak na LCD bra text_lcd_l1 ;pëtla text_lcd_quit: movem.l (a7)+,D0 ;rejestry ze stosu rts ;----------------------------------------------- ;Drukuje spacjë na LCD ;we: -- ;wy: -- ;zm: -- ; spc_lcd: movem.l D0,-(A7) ;Rejestry na stos move.b #" ",D0 ;Kod SPACJI bsr print_lcd ;Wyslanie do LCD movem.l (A7)+,D0 ;rejestry ze stosu rts ;----------------------------------------------- ;Czyôci wyôwietlacz LCD ;we: -- ;wy: -- ;zm: -- ; cls_lcd: movem.l D0,-(A7) ;Rejestry na stos move.b #%00000001,D0 ;rozkaz dla LCD bsr rozkaz_lcd ;wykonanie rozkazu bsr clear_tab_lcd ;Czyôę tablicë znaków dynamicznych movem.l (A7)+,D0 ;rejestry ze stosu rts ;----------------------------------------------- ;Wysyîa znak z rejestru D0 jako rozkaz do LCD ;we: D0.b - rozkaz do wysîania ;wy: -- ;zm: -- ; rozkaz_lcd: bsr wait_busy_lcd ;Czeka aű LCD wolny move.b D0,LCD_R rts ;----------------------------------------------- ;Ustawia kursor na pozycji wskazanej przez D0 ;we: D0.b - pozycja znaku na LCD ;wy: -- ;zm: D0 ; kursor_lcd: or.b #%10000000,d0 bra rozkaz_lcd ;----------------------------------------------- ;Czeka na zakoďczenie operacji przez strownik LCD ;we: -- ;wy: -- ;zm: -- ; wait_busy_lcd: movem.l D0,-(A7) ;rejestry na stos move.l #CAL100us*100,D0 ;licznik max czasu czekania (10ms) ; czas prawdziwy dla 6MHz wait_busy_lcd1: dbf D0,wait_busy_lcd2 ; - jeôli koniec czasu to wyjdú bra wait_busy_lcd3 wait_busy_lcd2: btst.b #7,LCD_R ;czy LCD wolny? bne wait_busy_lcd1 ; - nie toczekaj dalej wait_busy_lcd3: movem.l (a7)+,D0 ;rejestry ze stosu rts ;----------------------------------------------- ;Czeka czas zawarty w D1 razy 100µs (100µs...6,5s) ;we: D1.w - czas oczekiwania w us ;wy: -- ;zm: D1 ; delay_100us: andi #$ffff,d1 delay_100us_l1: movem.l d1,-(a7) ;rejestry na stos move.l #CAL100us,d1 ;D1 - Pëtla opóúniajâca 100us delay_100us_l2: nop ; czas prawdziwy dla 6MHz dbf d1,delay_100us_l2 movem.l (a7)+,d1 ;rejestry ze stosu dbf d1,delay_100us_l1 rts ;----------------------------------------------- txt_pc: DC.B ' PC=',0 txt_sr: DC.B ' SR=',0 txt_asccess: DC.B ' AC=',0 txt_fcode: DC.B ' FC=',0 txt_Ax DC.B ' Ax=',0 txt_Dx DC.B ' Dx=',0 txt_bus_err: DC.B CLS,'Bus',0 txt_adress_err: DC.B CLS,'Adres',0 txt_command_err:DC.B CLS,'Command',0 txt_division_err: DC.B CLS,'Division0',0 txt_chk_err: DC.B CLS,'Chk',0 txt_trapv_err: DC.B CLS,'TrapV',0 txt_prioryty_err: DC.B CLS,'Prioryty',0 txt_trap_err: DC.B CLS,'Trap',0 txt_emu1010_err:DC.B CLS,'Emu1010',0 txt_emu1111_err:DC.B CLS,'Emu1111',0 txt_init_int_err: DC.B CLS,'InitInt',0 txt_false_int_err: DC.B CLS,'FalseInt',0 txt_int1_err: DC.B CLS,'Int1',0 txt_int2_err: DC.B CLS,'Int2',0 txt_int3_err: DC.B CLS,'Int3',0 txt_int4_err: DC.B CLS,'Int4',0 txt_int5_err: DC.B CLS,'Int5',0 txt_int6_err: DC.B CLS,'Int6',0 txt_int7_err: DC.B CLS,'Int7',0 txt_trap0_err: DC.B CLS,'Trap0',0 txt_trap1_err: DC.B CLS,'Trap1',0 txt_trap2_err: DC.B CLS,'Trap2',0 txt_trap3_err: DC.B CLS,'Trap3',0 txt_trap4_err: DC.B CLS,'Trap4',0 txt_trap5_err: DC.B CLS,'Trap5',0 txt_trap6_err: DC.B CLS,'Trap6',0 txt_trap7_err: DC.B CLS,'Trap7',0 txt_trap8_err: DC.B CLS,'Trap8',0 txt_trap9_err: DC.B CLS,'Trap9',0 txt_trap10_err: DC.B CLS,'Trap10',0 txt_trap11_err: DC.B CLS,'Trap11',0 txt_trap12_err: DC.B CLS,'Trap12',0 txt_trap13_err: DC.B CLS,'Trap13',0 txt_trap14_err: DC.B CLS,'Trap14',0 txt_trap15_err: DC.B CLS,'Trap15',0 ;----------------------------------------------- tekst: DC.B CLS,'Ala ma kota, a kot ma chëę na ALË ',STRZALKA_L,STRZALKA_P,PLAY,0 ;----------------------------------------------- bo jakieś 20 lat minęło.
  9. Jak zdobędzie 74xx148 (teraz to chyba nie problem) to resztę na kilku 74xx zrobisz. Jak masz dostęp do programatora GAL lub PALCE, to mogę dać pliki źródłowe i wynikowe dla GAL. Potrzebne będą dwa GAL/PALCE. Poszukam tych plików, będziesz wiedział jak to było zbudowane, bo nawet BusError obsługiwałem. Coś już znalazłem (archiwum Amigi musiałem otworzyć): GAL, daję co mam: GAL20V8 dekoder ;---------------------------- Deklaracja pinów ---------------------- A3 A2 A1 RDL WRL CS0 CS1 IO2 IO3 RW NC GND NC NC DTACK CS574 NC ELCD NC NC CS245 IORDY NC VCC ;---------------------------- Dekoder adresowy ---------------------- /CS574 = /WRL * /IO2 * /A1 * /A2 * /A3 ;Rejestr 574 - IO2 #00 /CS245 = /RDL * /IO2 * /A1 * /A2 * /A3 ;Rejestr 245 - IO2 #00 ELCD = /RDL * /IO2 * A2 * /A3 ;LCD - IO2 #04-06 + /WRL * /IO2 * A2 * /A3 DESCRIPTION: GAL22V10 RW ;---------------------------- Deklaracja pinów ---------------------- Q7 NC NC AS UDS LDS RW FC2 FC1 FC0 NC GND ROM USER VPA BERR INTA WRU WRL RDU RDL R164 NC VCC ;---------------------------- Dekoder RD/WR ------------------------- /WRL = /LDS * /RW /WRU = /UDS * /RW /RDL = /LDS * RW /RDU = /UDS * RW ;---------------------------- Generator potwierdzenia przerwania ---- /VPA = FC0 * FC1 * FC2 * /AS /INTA = FC0 * FC1 * FC2 /USER = /FC2 * /RW ;Jeôli tryb uűytkownika i zapis to USER=L ;---------------------------- Pozostaîe ----------------------------- /R164 = AS ;Negator dla 74HCT164 /BERR = Q7 ;Negator dla wytworzenia BusError 74164 przepeîni sië + /ROM * /WRL ; lub gdy próba zapisu do ROML + /ROM * /WRU ; lub ROMU DESCRIPTION: GAL20V8 8 na 3 ;---------------------------- Deklaracja pinów ---------------------- Clock IRes NC NC IRQ1 IRQ2 IRQ3 IRQ4 IRQ5 IRQ6 IRQ7 GND OE ResI IPL0 IPL1 IPL2 Reset NC ResO Halt CLK NC VCC ;---------------------------- Enkoder 8 na 3 ------------------------ IPL0 = /IRQ2 * IRQ1 + /IRQ4 * IRQ1 * IRQ2 * IRQ3 + /IRQ6 * IRQ1 * IRQ2 * IRQ3 * IRQ4 * IRQ5 + IRQ1 * IRQ2 * IRQ3 * IRQ4 * IRQ5 * IRQ6 * IRQ7 IPL1 = /IRQ3 * IRQ1 * IRQ2 + /IRQ4 * IRQ1 * IRQ2 * IRQ3 + /IRQ7 * IRQ1 * IRQ2 * IRQ3 * IRQ4 * IRQ5 * IRQ6 + IRQ1 * IRQ2 * IRQ3 * IRQ4 * IRQ5 * IRQ6 * IRQ7 IPL2 = /IRQ5 * IRQ1 * IRQ2 * IRQ3 * IRQ4 + /IRQ6 * IRQ1 * IRQ2 * IRQ3 * IRQ4 * IRQ5 + /IRQ7 * IRQ1 * IRQ2 * IRQ3 * IRQ4 * IRQ5 * IRQ6 + IRQ1 * IRQ2 * IRQ3 * IRQ4 * IRQ5 * IRQ6 * IRQ7 ;---------------------------- Dzielnik przez 2 ---------------------- CLK.R = /CLK ;---------------------------- Reset --------------------------------- ResO.T = GND ;wyjôcie trójstanowe (.T) Halt.T = GND ;wyjôcie trójstanowe (.T) ResO.E = /IRes ;pin kontrolujâcy stan trzeci (.E) Halt.E = /IRes ;pin kontrolujâcy stan trzeci (.E) Reset = ResI DESCRIPTION: Wyjôcia trójstanowe: - wyjôcie oznaczone (.T) jest wyjôciem trójstanowym - opis po pinie oznaczonym (.E) okreôla kiedy wyjôcie bëdzie w stanie aktywnym, a kiedy w trzecim - wejôcie /OE wpîywa na wyjôcia rejestrowe (.R) i niewykorzystane (NC) GAL20V8 dekoder ;---------------------------- Deklaracja pinów ---------------------- A21 A22 A20 A19 A18 A17 A16 A15 IOE INTA USER GND Q1 Q2 QOE IO2 IO3 IO0 IO1 RAM ROM DTACK A23 VCC ;---------------------------- Dekoder adresowy ---------------------- /ROM = /A23 * /A22 * /A21 * /A20 * /A19 * /A18 * /A17 ;ROM $000000-$01ffff (128kb) /RAM = A23 * /A22 * /A21 * /A20 * /A19 * /A18 * /A17 * /A16 ;RAM $800000-$80ffff (64kb) /IO0 = A23 * A22 * /A21 * /A20 * /A19 * /A18 * /A17 * /A16 ;IO0 $c00000-$c0ffff (64kb) /IO1 = A23 * A22 * /A21 * /A20 * /A19 * /A18 * /A17 * A16 ;IO1 $c10000-$c1ffff (64kb) /IO2 = A23 * A22 * /A21 * /A20 * /A19 * /A18 * A17 * /A16 ;IO2 $c20000-$c2ffff (64kb) /IO3 = A23 * A22 * /A21 * /A20 * /A19 * /A18 * A17 * A16 ;IO3 $c30000-$c3ffff (64kb) /DTACK.T = /ROM * Q1 ;DTACK=L gdy wybrano ROM, + /RAM ; RAM, + /IO0 ; IO0, + /IO1 ; IO1, + /IO2 * Q2 ; IO2, + /IO3 * Q2 ; IO3 ;Rownanie z "* Q1" lub "* Q2" powoduje wstawienie ; jednego lub dwóch taktów oczekiwania /QOE = /ROM ;DTACK=wychodzi ze stanu trzeciego gdy zaadresowano dekoder + /RAM ; wyprowadzenia QOE i IOE sâ ze sobâ poîâczone + /IO0 + /IO1 + /IO2 + /IO3 DTACK.E = /IOE DESCRIPTION: ??? Dodaę: Jeôli USER=L i wybrany obszar RAM lub ROM supervisora to nie generowaę DTACK co spowoduje, űe próba zapisu RAM supervisora wywoîa BusError Jak chcesz to mogę dać komplet materiałów, łącznie z PCB w Autotrax.
  10. To jest to samo. Twoja sprawa. Chcesz walczyć z FPGA, walcz. STM32 spokojnie wystarczy i nie trzeba sięgać po H7, F4 w zupełności wystarczy. Jeśli jednak to za mało, bierzesz RPi .Nie wiem tylko, czy RPi obsłuży 7 enkoderów. Swego czasu, jak używałem głównie AVR, zrobiłem dwa projekty, w których AVR był wspomagany układem CPLD. Teraz to samo robię na STM32. Jeden projekt na F429, drugi na F103. Żaden CPLD czy tym bardziej FPGA nie jest potrzebny. Napisz w C obliczenia, które chcesz robić na FPGA, skompiluję na F411 100MHz, F4168MHz, H7 480MHz, F103 72MHz i zmierzę czas ich wykonania. Łatwo będzie ocenić czy FPGA jest niezbędna, czy nie. Widzę, że w FPGA już kombinujesz z liczbami stałoprzecinkowymi, tablicujesz co się da. Czyżby zasobów zaczęło brakować?
  11. Rób jak chcesz. Na ta chwilę jedyną płytkę jaka mam do dyspozycji to NUCLEO743Z2 (M7 480MHz) i nawet napisałem soft, kompiluje się ale nie sprawdzałem jeszcze ile czasu zajmuje obsługa przerwania (będą to co najwyżej setki ns - pracuję na 96MHz). Kto chce sprawdzić, proszę dwa najważniejsze pliki (cały projekt za duży na to forum): /* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics. * All rights reserved.</center></h2> * * This software component is licensed by ST under BSD 3-Clause license, * the "License"; You may not use this file except in compliance with the * License. You may obtain a copy of the License at: * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "string.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ int volatile cnt0, cnt1, cnt2, cnt3,cnt4, cnt5, cnt6; uint16_t volatile TimUart, TimLed; void irq1ms(void); /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ UART_HandleTypeDef huart3; DMA_HandleTypeDef hdma_usart3_tx; /* USER CODE BEGIN PV */ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_DMA_Init(void); static void MX_USART3_UART_Init(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ void irq1ms(){ if( TimUart ) TimUart--; if( TimLed ) TimLed--; } /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_DMA_Init(); MX_USART3_UART_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ HAL_GPIO_WritePin( LD3_GPIO_Port, LD3_Pin, GPIO_PIN_RESET ); // Czerwona HAL_UART_Transmit( &huart3, (uint8_t*)("\n\rStart\n\r"),9, 10 ); while (1) { if( !TimLed ){ TimLed = 500; HAL_GPIO_TogglePin( LD1_GPIO_Port, LD1_Pin); // Zielona } int32_t static prevCnt0, prevCnt1, prevCnt2, prevCnt3, prevCnt4, prevCnt5, prevCnt6; /* NVIC_DisableIRQ( EXTI0_IRQn ); NVIC_DisableIRQ( EXTI1_IRQn ); NVIC_DisableIRQ( EXTI2_IRQn ); NVIC_DisableIRQ( EXTI3_IRQn ); NVIC_DisableIRQ( EXTI4_IRQn ); NVIC_DisableIRQ( EXTI9_5_IRQn ); NVIC_DisableIRQ( EXTI15_10_IRQn ); */ if( (prevCnt6 != cnt6) || (prevCnt5 != cnt5) || (prevCnt4 != cnt4) || (prevCnt3 != cnt3) || (prevCnt2 != cnt2) || (prevCnt1 != cnt1) || (prevCnt0 != cnt0) ){ prevCnt6 = cnt6; prevCnt5 = cnt5; prevCnt4 = cnt4; prevCnt3 = cnt3; prevCnt2 = cnt2; prevCnt1 = cnt1; prevCnt0 = cnt0; /* NVIC_EnableIRQ( EXTI0_IRQn ); NVIC_EnableIRQ( EXTI1_IRQn ); NVIC_EnableIRQ( EXTI2_IRQn ); NVIC_EnableIRQ( EXTI3_IRQn ); NVIC_EnableIRQ( EXTI4_IRQn ); NVIC_EnableIRQ( EXTI9_5_IRQn ); NVIC_EnableIRQ( EXTI15_10_IRQn ); */ char static txt[100]; sprintf( txt, "%d %d %d %d %d %d %d\n\r", cnt0, cnt1, cnt2, cnt3,cnt4, cnt5, cnt6 ); //HAL_UART_Transmit_IT( &huart3, (uint8_t*)txt, strlen(txt) ); HAL_UART_Transmit( &huart3, (uint8_t*)txt, strlen(txt), 10 ); } else{ /* NVIC_EnableIRQ( EXTI0_IRQn ); NVIC_EnableIRQ( EXTI1_IRQn ); NVIC_EnableIRQ( EXTI2_IRQn ); NVIC_EnableIRQ( EXTI3_IRQn ); NVIC_EnableIRQ( EXTI4_IRQn ); NVIC_EnableIRQ( EXTI9_5_IRQn ); NVIC_EnableIRQ( EXTI15_10_IRQn ); */ } /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; /** Supply configuration update enable */ HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY); /** Configure the main internal regulator output voltage */ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3); while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {} /** Initializes the CPU, AHB and APB busses clocks */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_DIV1; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB busses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2 |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV1; RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { Error_Handler(); } PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART3; PeriphClkInitStruct.Usart234578ClockSelection = RCC_USART234578CLKSOURCE_D2PCLK1; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { Error_Handler(); } } /** * @brief USART3 Initialization Function * @param None * @retval None */ static void MX_USART3_UART_Init(void) { /* USER CODE BEGIN USART3_Init 0 */ /* USER CODE END USART3_Init 0 */ /* USER CODE BEGIN USART3_Init 1 */ /* USER CODE END USART3_Init 1 */ huart3.Instance = USART3; huart3.Init.BaudRate = 115200; huart3.Init.WordLength = UART_WORDLENGTH_8B; huart3.Init.StopBits = UART_STOPBITS_1; huart3.Init.Parity = UART_PARITY_NONE; huart3.Init.Mode = UART_MODE_TX_RX; huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart3.Init.OverSampling = UART_OVERSAMPLING_16; huart3.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; huart3.Init.ClockPrescaler = UART_PRESCALER_DIV1; huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; if (HAL_UART_Init(&huart3) != HAL_OK) { Error_Handler(); } if (HAL_UARTEx_SetTxFifoThreshold(&huart3, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) { Error_Handler(); } if (HAL_UARTEx_SetRxFifoThreshold(&huart3, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) { Error_Handler(); } if (HAL_UARTEx_DisableFifoMode(&huart3) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN USART3_Init 2 */ /* USER CODE END USART3_Init 2 */ } /** * Enable DMA controller clock */ static void MX_DMA_Init(void) { /* DMA controller clock enable */ __HAL_RCC_DMA1_CLK_ENABLE(); /* DMA interrupt init */ /* DMA1_Stream0_IRQn interrupt configuration */ HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn); } /** * @brief GPIO Initialization Function * @param None * @retval None */ static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOF_CLK_ENABLE(); __HAL_RCC_GPIOH_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE(); __HAL_RCC_GPIOE_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOB, LD1_Pin|LD3_Pin, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(USB_OTG_FS_PWR_EN_GPIO_Port, USB_OTG_FS_PWR_EN_Pin, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET); /*Configure GPIO pin : B1_USER_KEY_Pin */ GPIO_InitStruct.Pin = B1_USER_KEY_Pin; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(B1_USER_KEY_GPIO_Port, &GPIO_InitStruct); /*Configure GPIO pins : PF0 PF1 PF2 PF3 PF4 PF5 */ GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 |GPIO_PIN_4|GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); /*Configure GPIO pins : PC1 PC4 PC5 */ GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF11_ETH; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); /*Configure GPIO pins : PA1 PA2 PA7 */ GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF11_ETH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO pins : LD1_Pin LD3_Pin */ GPIO_InitStruct.Pin = LD1_Pin|LD3_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /*Configure GPIO pin : PB13 */ GPIO_InitStruct.Pin = GPIO_PIN_13; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF11_ETH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /*Configure GPIO pin : USB_OTG_FS_PWR_EN_Pin */ GPIO_InitStruct.Pin = USB_OTG_FS_PWR_EN_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(USB_OTG_FS_PWR_EN_GPIO_Port, &GPIO_InitStruct); /*Configure GPIO pin : PG7 */ GPIO_InitStruct.Pin = GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); /*Configure GPIO pins : PA8 PA11 PA12 */ GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_11|GPIO_PIN_12; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF10_OTG1_FS; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO pins : PD0 PD1 PD2 PD3 PD4 PD5 PD6 */ GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); /*Configure GPIO pins : PG11 PG13 */ GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_13; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF11_ETH; HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); /*Configure GPIO pin : LD2_Pin */ GPIO_InitStruct.Pin = LD2_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct); /* EXTI interrupt init*/ HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn); HAL_NVIC_SetPriority(EXTI1_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI1_IRQn); HAL_NVIC_SetPriority(EXTI2_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI2_IRQn); HAL_NVIC_SetPriority(EXTI3_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI3_IRQn); HAL_NVIC_SetPriority(EXTI4_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI4_IRQn); HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI9_5_IRQn); HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); } /* USER CODE BEGIN 4 */ /* USER CODE END 4 */ /** * @brief This function is executed in case of error occurrence. * @retval None */ void Error_Handler(void) { /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ /* USER CODE END Error_Handler_Debug */ } #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval None */ void assert_failed(uint8_t *file, uint32_t line) { /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */ } #endif /* USE_FULL_ASSERT */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ /* USER CODE BEGIN Header */ /** ****************************************************************************** * @file stm32h7xx_it.c * @brief Interrupt Service Routines. ****************************************************************************** * @attention * * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics. * All rights reserved.</center></h2> * * This software component is licensed by ST under BSD 3-Clause license, * the "License"; You may not use this file except in compliance with the * License. You may obtain a copy of the License at: * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "stm32h7xx_it.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN TD */ extern int volatile cnt0, cnt1, cnt2, cnt3,cnt4, cnt5, cnt6; /* USER CODE END TD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ /* External variables --------------------------------------------------------*/ extern DMA_HandleTypeDef hdma_usart3_tx; extern UART_HandleTypeDef huart3; /* USER CODE BEGIN EV */ /* USER CODE END EV */ /******************************************************************************/ /* Cortex Processor Interruption and Exception Handlers */ /******************************************************************************/ /** * @brief This function handles Non maskable interrupt. */ void NMI_Handler(void) { /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ /* USER CODE END NonMaskableInt_IRQn 0 */ /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ /* USER CODE END NonMaskableInt_IRQn 1 */ } /** * @brief This function handles Hard fault interrupt. */ void HardFault_Handler(void) { /* USER CODE BEGIN HardFault_IRQn 0 */ /* USER CODE END HardFault_IRQn 0 */ while (1) { /* USER CODE BEGIN W1_HardFault_IRQn 0 */ /* USER CODE END W1_HardFault_IRQn 0 */ } } /** * @brief This function handles Memory management fault. */ void MemManage_Handler(void) { /* USER CODE BEGIN MemoryManagement_IRQn 0 */ /* USER CODE END MemoryManagement_IRQn 0 */ while (1) { /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ /* USER CODE END W1_MemoryManagement_IRQn 0 */ } } /** * @brief This function handles Pre-fetch fault, memory access fault. */ void BusFault_Handler(void) { /* USER CODE BEGIN BusFault_IRQn 0 */ /* USER CODE END BusFault_IRQn 0 */ while (1) { /* USER CODE BEGIN W1_BusFault_IRQn 0 */ /* USER CODE END W1_BusFault_IRQn 0 */ } } /** * @brief This function handles Undefined instruction or illegal state. */ void UsageFault_Handler(void) { /* USER CODE BEGIN UsageFault_IRQn 0 */ /* USER CODE END UsageFault_IRQn 0 */ while (1) { /* USER CODE BEGIN W1_UsageFault_IRQn 0 */ /* USER CODE END W1_UsageFault_IRQn 0 */ } } /** * @brief This function handles System service call via SWI instruction. */ void SVC_Handler(void) { /* USER CODE BEGIN SVCall_IRQn 0 */ /* USER CODE END SVCall_IRQn 0 */ /* USER CODE BEGIN SVCall_IRQn 1 */ /* USER CODE END SVCall_IRQn 1 */ } /** * @brief This function handles Debug monitor. */ void DebugMon_Handler(void) { /* USER CODE BEGIN DebugMonitor_IRQn 0 */ /* USER CODE END DebugMonitor_IRQn 0 */ /* USER CODE BEGIN DebugMonitor_IRQn 1 */ /* USER CODE END DebugMonitor_IRQn 1 */ } /** * @brief This function handles Pendable request for system service. */ void PendSV_Handler(void) { /* USER CODE BEGIN PendSV_IRQn 0 */ /* USER CODE END PendSV_IRQn 0 */ /* USER CODE BEGIN PendSV_IRQn 1 */ /* USER CODE END PendSV_IRQn 1 */ } /** * @brief This function handles System tick timer. */ void SysTick_Handler(void) { /* USER CODE BEGIN SysTick_IRQn 0 */ extern void irq1ms(void); irq1ms(); /* USER CODE END SysTick_IRQn 0 */ HAL_IncTick(); /* USER CODE BEGIN SysTick_IRQn 1 */ /* USER CODE END SysTick_IRQn 1 */ } /******************************************************************************/ /* STM32H7xx Peripheral Interrupt Handlers */ /* Add here the Interrupt Handlers for the used peripherals. */ /* For the available peripheral interrupt handler names, */ /* please refer to the startup file (startup_stm32h7xx.s). */ /******************************************************************************/ /** * @brief This function handles EXTI line0 interrupt. */ void EXTI0_IRQHandler(void) { /* USER CODE BEGIN EXTI0_IRQn 0 */ if( HAL_GPIO_ReadPin( GPIOD , GPIO_PIN_0 ) ) cnt0++; else cnt0--; /* USER CODE END EXTI0_IRQn 0 */ HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); /* USER CODE BEGIN EXTI0_IRQn 1 */ /* USER CODE END EXTI0_IRQn 1 */ } /** * @brief This function handles EXTI line1 interrupt. */ void EXTI1_IRQHandler(void) { /* USER CODE BEGIN EXTI1_IRQn 0 */ if( HAL_GPIO_ReadPin( GPIOD , GPIO_PIN_1 ) ) cnt1++; else cnt1--; /* USER CODE END EXTI1_IRQn 0 */ HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1); /* USER CODE BEGIN EXTI1_IRQn 1 */ /* USER CODE END EXTI1_IRQn 1 */ } /** * @brief This function handles EXTI line2 interrupt. */ void EXTI2_IRQHandler(void) { /* USER CODE BEGIN EXTI2_IRQn 0 */ if( HAL_GPIO_ReadPin( GPIOD , GPIO_PIN_2 ) ) cnt2++; else cnt2--; /* USER CODE END EXTI2_IRQn 0 */ HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2); /* USER CODE BEGIN EXTI2_IRQn 1 */ /* USER CODE END EXTI2_IRQn 1 */ } /** * @brief This function handles EXTI line3 interrupt. */ void EXTI3_IRQHandler(void) { /* USER CODE BEGIN EXTI3_IRQn 0 */ if( HAL_GPIO_ReadPin( GPIOD , GPIO_PIN_3 ) ) cnt3++; else cnt3--; /* USER CODE END EXTI3_IRQn 0 */ HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3); /* USER CODE BEGIN EXTI3_IRQn 1 */ /* USER CODE END EXTI3_IRQn 1 */ } /** * @brief This function handles EXTI line4 interrupt. */ void EXTI4_IRQHandler(void) { /* USER CODE BEGIN EXTI4_IRQn 0 */ if( HAL_GPIO_ReadPin( GPIOD , GPIO_PIN_4 ) ) cnt4++; else cnt4--; /* USER CODE END EXTI4_IRQn 0 */ HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4); /* USER CODE BEGIN EXTI4_IRQn 1 */ /* USER CODE END EXTI4_IRQn 1 */ } /** * @brief This function handles DMA1 stream0 global interrupt. */ void DMA1_Stream0_IRQHandler(void) { /* USER CODE BEGIN DMA1_Stream0_IRQn 0 */ /* USER CODE END DMA1_Stream0_IRQn 0 */ HAL_DMA_IRQHandler(&hdma_usart3_tx); /* USER CODE BEGIN DMA1_Stream0_IRQn 1 */ /* USER CODE END DMA1_Stream0_IRQn 1 */ } /** * @brief This function handles EXTI line[9:5] interrupts. */ void EXTI9_5_IRQHandler(void) { /* USER CODE BEGIN EXTI9_5_IRQn 0 */ // INFO: 5..9 aktywne tylko 5 wiec nie trzeba sprawdzac zrodla przerwania if( HAL_GPIO_ReadPin( GPIOD , GPIO_PIN_5 ) ) cnt5++; else cnt5--; /* USER CODE END EXTI9_5_IRQn 0 */ HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5); /* USER CODE BEGIN EXTI9_5_IRQn 1 */ /* USER CODE END EXTI9_5_IRQn 1 */ } /** * @brief This function handles USART3 global interrupt. */ void USART3_IRQHandler(void) { /* USER CODE BEGIN USART3_IRQn 0 */ /* USER CODE END USART3_IRQn 0 */ HAL_UART_IRQHandler(&huart3); /* USER CODE BEGIN USART3_IRQn 1 */ /* USER CODE END USART3_IRQn 1 */ } /** * @brief This function handles EXTI line[15:10] interrupts. */ void EXTI15_10_IRQHandler(void) { /* USER CODE BEGIN EXTI15_10_IRQn 0 */ HAL_GPIO_WritePin( LD3_GPIO_Port, LD3_Pin, GPIO_PIN_RESET ); // Czerwona HAL_GPIO_TogglePin( LD2_GPIO_Port, LD2_Pin); // Zolta // INFO: 10..15 aktywne tylko 13 wiec nie trzeba sprawdzac zrodla przerwania if( HAL_GPIO_ReadPin( GPIOD , GPIO_PIN_6 ) ) cnt6++; else cnt6--; /* USER CODE END EXTI15_10_IRQn 0 */ HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13); /* USER CODE BEGIN EXTI15_10_IRQn 1 */ HAL_GPIO_WritePin( LD3_GPIO_Port, LD3_Pin, GPIO_PIN_SET ); // Czerwona // INFO: czas obslugi IRQ = /* USER CODE END EXTI15_10_IRQn 1 */ } /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ Resztę każdy może sobie wygenerować z CubeMX. Wybrałem przerwania EXTI0..4 i po jednym z grupy 5..9 i 10..15 więc nie trzeba rozpoznawać źródła przerwania co jest bardzo proste, jeden if. Moja przygoda z układami programowalnymi rozpoczęła się w zeszłym tysiącleciu. Znam GAL, CPLD i FPGA. Kiedyś często ich używałem, teraz mikrokontrolery są tak wyposażone, że najczęściej nie ma potrzeby sięgać po drogie FPGA.
  12. Zgadzam się: Płytkę kupił złą, ma za mało GPIO ale nic dokładać do tej płytki nie chce, uczyć się nie chce (na komunię to robi? Już były!). Jak niby pomóc w takiej sytuacji? Kupić, zrobić, podarować, podziękować? Takie rzeczy to tylko w Erze (jak ktoś pamięta reklamę).
  13. Będzie jak napiszesz mądrze albo użyjesz HAL_GPIO_EXTI_Callback Nie czytałem tych wypocin bo w tym projekcie FPGA jest zbędna. Odnoszę wrażenia, ze znasz FPGA nie znasz ARM i dlatego na siłę próbujesz udowodnić, ze FPGA będzie lepsza.
  14. Widać nie znasz konstrukcji mikrokontrolera. Przerwanie nie będzie zgubione tylko nie zostanie wygenerowane do czasu jego odblokowania. Aby zgubić przerwanie musiałoby nastąpić dwa lub więcej razy zbocze generujące przerwanie a nie sądzę, aby enkoder dał kilkaset impulsów na sekundę. Jak się nie umie na mikrokontrolerze to do banalnych działań zaprzęga się FPGA. Komplikuje o zbędny, w tym przypadku, FPGA. Nie widzisz w kodzie licznik++ i licznik-- ? Po co mam powtarzać taki sam fragment kilka razy? Pokazałem jak obsłużyć jeden enkoder tak samo obsłużysz i 20. W pierwszych postaw wyraźnie napisano że są optyczne. Jeśli mechaniczne, to nie mogą pracować zbyt szybko no i ile taki mechaniczny wytrzyma? Jeśli już rzucasz mi kody pod nogi to pokaż jak w FPGA zrealizujesz likwidację drżenia styków. Ja obsłużę wejścia enkodera w przerwaniu 1ms z programowym filtrem RC if( wejscie ) if( filtr < 10 ) filtr++; else fl_key = true; else if ( filtr > -10 ) filtr--; else fl_key = false; No i mam filtr RC 20ms, pokaż rozwiązanie dla FPGA. Nie muszę testować bo już używałem tego co pokazałem wcześniej. Aby zrobić dobre testy przyślij mi enkodery sprzęgnięte z silnikiem, jakiś sprzęt, który tym wszystkiem steruje zakładając najgorszy przypadek. Co to za dyskusja, jak nie wiesz, że flaga przerwania jest ustawiona nawet jak przerwanie jest wyłączone? W tym co jużnapisałem wskazałeś dwa, według Ciebie błędy, których nie ma! Taka dyskusja nie ma sensu!
  15. Zabezpieczenie nic nie da, bo i tak można otrzymać wartości, które można będzie zaliczyć do jednej z 2 kombinacji przycisków. Zwykła matematyka, 2^6 = 64. 100 / 64 = 1,56. Trzeba użyć rezystorów 1% przyciski w drabince R-2R co komplikuje konstrukcję (o problemach prostego rozwiązania pisałem, nieliniowość). Najmniejsza różnica napięć pomiędzy wynikami takiego przetwornika to niecałe 8mV przy zasilaniu 5V (co ciekawe, nie musi ono być stabilne). W praktyce, ADC w AVR osiąga 8 bit czyli rozróżni napięcia ok 1mV. Z matematycznego punktu widzenia wszystko ok ale jak trafimy kilka rezystorów z +1% a kilka z -1%? Trzeba też pamiętać, że przetworniki w mikrokontrolerach mają dużą nieliniowość dla skrajnie wysokich i niskich napięć. Rozwiązanie z ADC i większą liczbą przycisków, miałoby jakiś tam sens, gdyby użyć przetwornika DAC. Taki 8-bit ma rezystory ok 0,1%, ale jak pchać dodatkowe scalaki to nie prościej expander albo jak już pisałem, mikrokontroler z większą liczbą GPIO. Przyznam, że nie wiem dlaczego, mimo, iż mikrokontroler ma dużo GPIO, w wielu projektach z Arduino LCD jest włączany przez ekspander I2C? Może mnie ktoś oświecić? Tak samo, po co pchać ekspander za 4..6zł jak można wybrać mikrokontroler droższy a czasem tańszy o 1 czy 2 zł z większą liczbą GPIO? Gdzie sens? Gdzie logika?
×
×
  • Utwórz nowe...