Wir programmieren die Kassiererin neu und drucken darauf Keanu Reeves

Hallo Habr!

Sobald ich einen „Job“ hatte, musste die Registrierkasse Shtrikh-FR-K verwaltet werden. Da meine Karriere mit der Reparatur von KKT begann, beschloss ich, diese Arbeit aufzunehmen.

Bild

So sehen die Abendkasse selbst und das Testbild meines Kollegen aus:

Bild

Außerdem musste ich nach der Steuerung der Engines und des Thermokopfs im Gerät ein kleines Python-Skript mit der OpenCV-Bibliothek schreiben. Also lass uns gehen.

Alles begann mit dem Studium von Rem. Dock. an diese Kasse und den anschließenden Anschluss des Logikanalysators an die Thermokopfstifte. Ich habe den Buchstaben "C" gesendet, um ihn durch einen Balkentest zu drucken. Und hier ist was ich habe:

Bild

Laut DATA ist der Wert der Punkte (432 Punkte pro Zeile), SCK-Taktsignal, STB0, STB1, STB2 - Blitze zum Erwärmen des Thermokopfes, LATCH - Daten-Latch. Ich fuhr eine Linie in das Schieberegister, verbrannte sie und fuhr fort.

Der nächste Schritt war die Fertigstellung des Boards, um den Entwicklungsprozess zu beschleunigen.

Bild

Kommen wir nun zum Code.

void go(int n, int shag) { switch (shag) { case 0: PORTA=0b10001000; PORTD|=(1<<2); dela(n); PORTD&=0b11111011; PORTA=0; PORTD|=(1<<2); PORTD&=0b11111011; break; case 1: PORTA=0b10101010; PORTD|=(1<<2); dela(n); PORTD&=0b11111011; PORTA=0; PORTD|=(1<<2); PORTD&=0b11111011; break; case 2: PORTA=0b00100010; PORTD|=(1<<2); dela(n); PORTD&=0b11111011; PORTA=0; PORTD|=(1<<2); PORTD&=0b11111011; break; case 3: PORTA=0b01100110; PORTD|=(1<<2); dela(n); PORTD&=0b11111011; PORTA=0; PORTD|=(1<<2); PORTD&=0b11111011; break; case 4: PORTA=0b01000100; PORTD|=(1<<2); dela(n); PORTD&=0b11111011; PORTA=0; PORTD|=(1<<2); PORTD&=0b11111011; break; case 5: PORTA=0b01010101; PORTD|=(1<<2); dela(n); PORTD&=0b11111011; PORTA=0; PORTD|=(1<<2); PORTD&=0b11111011; break; case 6: PORTA=0b00010001; PORTD|=(1<<2); dela(n); PORTD&=0b11111011; PORTA=0; PORTD|=(1<<2); PORTD&=0b11111011; break; case 7: PORTA=0b10011001; PORTD|=(1<<2); dela(n); PORTD&=0b11111011; PORTA=0; PORTD|=(1<<2); PORTD&=0b11111011; break; } } 

Für diese Abendkasse gibt es zwei Schrittmotor-Steuerkreise. 4-stufig und 8-stufig. Ich habe 8 gewählt, da die Motoren besser funktionierten.

 #define DATA 2 #define SCK 1 #define LATCH 3 #define STB0 2 #define STB1 3 #define STB2 4 #define DATA_IN PORTB #define STB_IN PORTE int sck() { _delay_us(3); DATA_IN|= (1<<SCK); DATA_IN&= 0b11111101; } int x; int bit; void bait(int bait1) { x=0; while(x<8) { bit|= (1<<x); bit =bait1&bit; if (bit>0) { DATA_IN|=(1<<DATA); } else {DATA_IN&=0b11111011;} sck(); x++; } } void latch() { DATA_IN&=0b11110111; DATA_IN|=(1<<LATCH); } 

Code zum Senden von Daten an den Thermokopf. Der Thermokopf fungiert als Schieberegister. Wie es funktioniert, habe ich oben geschrieben.

 void print_all_pixel() { while(n<55) { print_stroka(str[n]); _delay_us(3); n++; } latch(); n=0; STB_IN&=0b11111011; _delay_us(500); STB_IN|=(1<<STB0); STB_IN&=0b11110111; _delay_us(500); STB_IN|=(1<<STB1); STB_IN&=0b11101111; _delay_us(500); STB_IN|=(1<<STB2); //vpered(300); //n=0; //_delay_ms(100); //vpered(100); } 

Die Funktion zum Drucken und Brennen von Linien.

 void recieve() { ///while(f); if ((com==0x50)&&(rezhim==0))/// P { //USART_Transmit('X'); com=0; USART_Transmit('B'); rezhim=1; } if ((rezhim==1)&&(send!=0)) { str[iFF]=com; send=0; iFF++; if (send == 1) { USART_Transmit('B'); } if (iFF==54) { USART_Transmit('P'); USART_Transmit('R'); USART_Transmit('I'); USART_Transmit('N'); USART_Transmit('T'); USART_Transmit('E'); USART_Transmit('D'); PORTB|=1<<0; _delay_ms(1); print_all_pixel(); //print_all_pixel(); go1(1500,ggg); rezhim=0; iFF=0; ggg++; if (ggg==8) { ggg=0; } } } if ((com==0x52)&&(rezhim==0))///R { com=0; go1(1000,ggg); rezhim=0; iFF=0; ggg++; if (ggg==8) { ggg=0; } USART_Transmit('O'); USART_Transmit('K'); //vpered(300); } } 

Die Hauptfunktion, die sich in der ewigen Datei dreht. Wenn der Buchstabe "P" eingeht, schalte ich den Druckmodus ein. Außerdem werden alle anderen Zeichen in den Puffer eingegeben. Wenn der Puffer mit 54 Bytes (oder 432 Bits) gepackt ist, drucken wir die Zeile und senden das Wort PRINTED über USART.
Nun, das ist alles mit dem Eisenteil. Im nächsten Teil werde ich über den Software-Teil schreiben, nämlich über das Programm in Python. Quellen .

Bild

Source: https://habr.com/ru/post/de465867/


All Articles