
Witam.
Oto mój następny projekt.
Myślę, że może się komuś przydać.
Projekt powstał w wyniku chęci wykorzystania czytnika , który kiedyś kupiłem na alledrogo

okazało się , że jego pinout nie zgadza się , z żadnym sprzedawanym na rynku (a przynajmniej kolory przewodów się nie zgadzają).
No nic... po wielu bojach udało mi się rozpracować pinologię wyprowadzeń.
Czytnik oparty jest o specjalizowany układ KD2320B ... ale nie udało mi się odnaleźć jego aplikacji (można go tylko kupić u naszych chińskich kolegów).
topografia wyprowadzeń :
- czerwony - 5V zasilanie (to było w miarę oczywiste)
- czarny - masa (GND)
- brązowy - STROBE (CLK)
- pomarańcz - DATA
- zielony - CARD PRESENT (pojawia się niski po wykryciu obecności ścieżki z danymi na karcie)
mając te dane i posługując się troszkę netem udało mi się napisać program na atmegę8 który czyta jedną ścieżkę (bo te karty mają ich czasem więcej).
Kartę trzeba przeciągnąć w jednym kierunku bo w drugą stronę wywala masę głupot.

poniżej umieszczam kod programu działa bezbłędnie .
Atmega pracuje na 8MHz taktowanie wewnętrzne.
Code:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include <avr/io.h>
#include <util\delay.h>
#include <avr/interrupt.h>
#include <avr/io.h>
#define BitVal(x) (1 << (x))
#define CARD_PRESENT ((PIND & 0x80)==0)
#define CARD_NOTPRESENT ((PIND & 0x80)==0x80)
#define DANE ((~PIND) & 1)
unsigned char CiagBitow[100];
unsigned char Znak, ptrS, ptrD;
unsigned char wposrednia=1;
void ConvertASCII(void );
void Przerwanie_init()
{
MCUCR |= BitVal(ISC01) | BitVal(ISC00);
GICR = BitVal(INT0);
ptrS = ptrD = 0;
}
void main(void )
{
DDRB=0b00000011;
Przerwanie_init();
sei();
while(1){
while(CARD_NOTPRESENT){
}
wposrednia = 1;
while(CARD_PRESENT){
}
ConvertASCII();
}
}
SIGNAL(SIG_INTERRUPT0)
{
if(wposrednia){
if(DANE == 1) {
wposrednia=0;
Znak = 0x40;
ptrS = 1;
ptrD = 0;
}
} else
{
Znak = Znak >> 1 | ((DANE)?0x40:0);
ptrS++;
if (ptrS == 7){
ptrS = 0;
CiagBitow[ptrD] = Znak;
Znak = 0;
ptrD++;
}
}
}
void ConvertASCII(void ){
unsigned char i;
char str1[15]; //tutaj podajemy ile znakow ma odczytywac do zmiennej +1 ... oryginalnie koniec znakow oznaczony jest: ?
for(i=0; i< ptrD; i++){
CiagBitow[i] = (CiagBitow[i] & 0x3F) + 0x20;
}
strncpy(str1,CiagBitow,14);
str1[14]='\0';
if (strcmp(str1,"%MAR0020251651")==0) {PORTB ^=_BV(1);}
if (strcmp(str1,"%MAR0022389903")==0) {PORTB ^=_BV(0);}
}
Jak widać w programie odczytuję tylko 14 bajtów ... można wszystkie ale wtedy należy pamiętać, że ostatnim znakiem będzie zawsze: ?
Do tego softu teraz muszę dodać uczenie kart np jakimś przyciskiem serwisowym .
Do czego to może służyć ... ja używam do załączania zasilania w warsztacie . Z bratem mamy 2 stanowiska i teraz jest bajer


oczywiście to tylko taki bajer .
Ale pomysłów na zastosowanie znajdziecie na pewno wiele .
tu zdjęcie układu podczas testowania.

ja akurat użyłem karty do zbierania punktów z BP ... ale sprawdzałem na karcie VISA też działa.
Pozdrawiam
i mam nadzieję, że ktoś z tego skorzysta .
W sumie ja się z tym męczyłem trochę - głównie dlatego , że nie chciało mi się rozpracowywać jak to podłączyć.
Jeśli ktoś z kolegów będzie chciał taki czytnik to parę mogę odstąpić.
Sam ich raczej nie wykorzystam - w takiej sytuakcji proszę PW
Pozdrawiam
Marek
p.s.
jeśli uda mi się dodać tą funkcję zapamietywania z przycisku to wrzucę kod programu.
Cool? Ranking DIY