Čtečka telefonních karet

Zdravím
V Amatérském rádiu A/9/1995 je článek kde se popisuje čtečka telefonních karet (odkaz naleznete na fóru dostupném pouze přihlášeným uživatelům) kterou jsem upravil asi v roce 1997 pro turbo pascal na počítač SHARP MZ-800 a fungovalo to a chtěl jsem to upravit na atmegu8-16 zatím mám rozepsaný tento zdroják díky za trpělivost

:arrow_right: administrator: příspěvek byl upraven
Odebral jsem odkazy.
LCD_Test.c (2.18 KB)

Zdravím
Už mě to čte ten obsah telefonní karty problém je v tom že ne správně nevím jestli hraje roli načasování nebo čím? potřebuji taky vědět když nastavím piny jako výstupní jestli je tam automaticky pull-up nebo ne ?
a jak se nastavuje logická 1 tak? PORTC |= 1<<PC1 a jak se nastavuje logická 0? v příloze je ten článek sice je to drobátko malé a nečitelné ale bojoval jsem z velikostí přílohy která se musí vejít do určité velikosti tak se za to omlouvám díky za trpělivost .

[code]
for (i = 0; i < 255 ; i++)
{
PORTC |= 1<<reset;PORTC |= 1<<clock;

if(!(PINC & (1<<PC3)))
obsah* = 0x01;
else
obsah*= 0x00;

PORTC = PINC ^ 1<<clock; PORTC = PINC ^ 1<<reset;
}
[/code]**

JPG rozmazává, pro text zkus použít spíš gif nebo tiff.
Každopádně bit se nuluje pomocí PORTx &= ~(1<<Pxm | 1<<Pxn …);
To, co máš na posledním řádku je negace (XOR s “1”).
Na tom obrázku jsou viditelný jakýsi kroky po 20ms. To by bylo vhodný dodržet. Přidej si hlavičkový soubor delay.h a v něm je funkce _delay_ms();

Tak jsem to upravil tak pro lepší čitelnost díky za pomoc při napsání správného kódu na přečtení obsahu té telefonní karty a taky za trpělivost.


Využívání 1B pro uložení 1b - úžasný plejtvání pamětí, na menším procesoru (kterej by na to bezproblému stačil) by sis ani neškrt. Kdybys použil správně dimenzovanou strukturu, nebylo by potřeba víc jak 40B. Takhle máš 256B jen pro načtení bez jakýhokoli zpracování načtených dat.
Ale je pravda, že je to jednodušší na pochopení.
Následující kus kódu by tu kartu snad měl být schopen přečíst. Ovšem 40ms na 1 bit je docela dost (přečíst celou kartu by trvalo 10s). Můžeš pak zkusit zkrátit pauzy.

edit: Podle tohoto textu(až na konci) tkk.fi/Misc/Electronics/docs … s_work.txt by měly být pulzy nad 10ms nutné jen pro zápis. Pro čtení by měly stačit pauzy 100us.

:arrow_right: administrator: přiloženy externí soubory
how_chips_work.txt (45.3 KB)
main.c (1.23 KB)

Zdravím
Pořád nemohu dojít ke úspěšnému konci ve visual basicu mě to jde tady je kód s nákresem zapojení díky za trpelivost

Private Sub Command2_Click()
i = OPENCOM("COM1,1200,n,8,1")
DTR 0
RTS 0
TXD 0
Dim pole(0 To 255) As Byte
Dim ind(1 To 40) As Single
Dim x As Single
Dim de As Integer
Dim je As Integer
Dim sto As Integer
Dim vytel As Integer
Dim scislo As Single
Dim vysledek As Integer
vysledek = 0
vytel = 0
sto = 0
je = 0
de = 0
x = 1
For o = 1 To 40
ind(o) = x
x = x * 2
Next o
DTR 1  'reset
RTS 1 'clock
'RTS 0   'clock
'DTR 0 'reset
For i = 0 To 255
List1.List(i) = RI & "        " & i
pole(i) = RI
DTR 1: RTS 1
RTS 0: DTR 0
Next i
RTS 0
DTR 0
x = 0
For z = 79 To 41 Step -1
x = x + 1
If pole(z) = 1 Then scislo = scislo + ind(x)
Next z
x = 0
For z = 27 To 24 Step -1
x = x + 1
If pole(z) = 1 Then de = de + ind(x)
Next z
x = 0
For z = 31 To 28 Step -1
x = x + 1
If pole(z) = 1 Then je = je + ind(x)
Next z
x = 0
For z = 23 To 20 Step -1
x = x + 1
If pole(z) = 1 Then sto = sto + ind(x)
Next z
vysledek = (je + (de * 10) + (sto * 100))
label1.Caption = vysledek
For z = 96 To 255
If pole(z) = 1 Then vytel = vytel + 1
Next z
label2.Caption = vysledek - vytel
label5.Caption = Format(scislo, "0")
DTR 0
RTS 0
CLOSECOM
End Sub

telefonni_karta.JPG

Možná bych v tom něco vyčet, kdyby to bylo formátovaný… Tohle luštit nebudu. To je takovej problém udělat na začátku těla cyklu nebo podmínky tabelátor aby byl vnitřek odsazenej? Jak v tom můžeš i ty sám něco vidět?
Mimochodem - nějaká ta čárka nebo tečka ve větě by taky neuškodila…

to piityy ten tvůj kód main.c už mě funguje díky za trpělivost

Kde byla chyba? Jde to zrychlit (s těma 20ms intervalama by to bylo docela pomalý)?

Já jsem ten tvůj kód chtěl upravit na jiné piny na kterých jsem měl připojenu čtečku tel.karet a to nešlo, tak jsem připojil tu čtečku na piny které jsou nastaveny ve tvém kódu a jde to.Co se týče rychlosti to mi vyhovuje a nebudu na tom nic měnit díky za trpělivost

Ono by to šlo, jen na to nebyl program uzpůsobenej. Na jinym bitu to totiž ukládalo do pole jiný číslo než 1. Např. na PC2 by to uložilo číslo 0000 0100, což je 4.
Stačí řádek: obsah* = CARD_PIN & 1<<OUT; // nacteni bitu z karty nahradit kódem:if(CARD_PIN & 1<<OUT) obsah* = 1; else obsah* = 0;a mělo by to makat i na jiných pinech (stejnýho portu).***

Zdravím
Mám tady další otázky: jak je správná syntaxe

if ((obsah[0] == 0) AND (obsah[4] == 0))
a další věc kde si mohu prohlédnout vygenerovaný kód v asembleru napsaný v AVR studiu 4-AVR GCC ? díky za trpělivost

Logický AND = &&, OR = ||. Divil bych se, kdyby to ve tvé knížce o C nebylo :wink:. Kapitola bude nejspíš o logických a bitových operátorech.

V AVR Studiu je mezi soubory projektu jeden s příponou “lss”. Tam je jakýsi náznak assembleru. Další, mnohem lepší, je když si po spuštění simulace otevřeš “disassembler window”. Ikonu má vpravo nahoře v panelu nástrojů.

Po dlouhé době jsem oprášil tuhle konstrukci leželo mi to na kontaktním poli ale bohužel mě tam ukazuje nesmyslný výsledek ,už jsem i ze starého PC vytáhl hex soubor a naprogramoval to znovu a pořád je to stejné.Osciloskopem jsem zjišťoval jestli je nějaký průběh na výstupu pinu MCU CLK co vede do čtečky tel. karet ale tam není žádný průběh mohlo se stát že je pin v trapu? přikládám přílohu

to vyskousej, ledku snad nejakou najdes ne ?