مرحبا يا هبر!
بمجرد حصولي على "وظيفة" - كان من الضروري إدارة السجل النقدي Shtrikh-FR-K. منذ أن بدأت مسيرتي في إصلاح KKT ، قررت تولي هذا العمل.

هكذا يبدو شباك التذاكر نفسه والصورة التجريبية لزميلي:

أيضًا ، بعد التحكم في المحركات والرأس الحراري في الجهاز ، اضطررت إلى كتابة نص بيثون صغير باستخدام مكتبة OpenCV. لذلك دعونا نذهب.
بدأ كل شيء مع دراسة rem. قفص الاتهام. إلى مكتب النقد والاتصال اللاحق لمحلل المنطق بدبابيس الرأس الحرارية. لقد أرسلت الرسالة "C" للطباعة من خلال اختبار الشريط. وهنا ما حصلت عليه:

وفقًا لـ DATA ، فإن قيمة النقاط (432 نقطة لكل خط) ، وإشارة ساعة SCK ، STB0 ، STB1 ، STB2 - هي مصابيح تسخين الرأس الحرارية ، LATCH - مزلاج البيانات. اضطررت إلى الدخول في سجل التحول ، وأحرقته ، وذهبت.
والخطوة التالية هي وضع اللمسات الأخيرة على المجلس لتسريع عملية التطوير.

الآن دعنا ننتقل إلى الكود.
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; } }
هناك دائرتان للتحكم في المحركات ذات السائر لهذا الشباك. 4 خطوات و 8 خطوات. اخترت 8 كما عملت محركات أفضل.
#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); }
رمز لإرسال البيانات إلى الرأس الحراري. يعمل الرأس الحراري كسجل تحويل. كيف يعمل ، كتبت أعلاه.
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);
وظيفة الطباعة وحرق الخطوط.
void recieve() {
الوظيفة الرئيسية التي تدور في الملف الأبدي. عندما يأتي الحرف "P" ، أقوم بتشغيل وضع الطباعة. علاوة على ذلك ، تبدأ جميع الأحرف الأخرى في كتابتها في المخزن المؤقت. علاوة على ذلك ، عندما يتم تعبئة المخزن المؤقت بـ 54 بايت (أو 432 بت) ، فإننا نطبع السطر ونرسل الكلمة المطبوعة عبر USART.
حسنًا ، هذا كل شيء مع الجزء الحديدي. في الجزء التالي ، سأكتب عن جزء البرنامج ، أي عن البرنامج في بيثون.
المصادر .
