ዝርዝር ሁኔታ:

AVR ሰብሳቢ መማሪያ 3: 9 ደረጃዎች
AVR ሰብሳቢ መማሪያ 3: 9 ደረጃዎች

ቪዲዮ: AVR ሰብሳቢ መማሪያ 3: 9 ደረጃዎች

ቪዲዮ: AVR ሰብሳቢ መማሪያ 3: 9 ደረጃዎች
ቪዲዮ: ትንታኔ እና ትርፋማነት፣ Mewtwo Elite Trainer Boxን መክፈት፣ EB10.5 Pokemon Go 2024, ሀምሌ
Anonim
AVR ሰብሳቢ መማሪያ 3
AVR ሰብሳቢ መማሪያ 3

ወደ የመማሪያ ቁጥር 3 እንኳን በደህና መጡ!

እኛ ከመጀመራችን በፊት የፍልስፍና ነጥብን ማንሳት እፈልጋለሁ። በእነዚህ መማሪያዎች ውስጥ የምንገነባቸውን ወረዳዎች እና ኮዱን ለመሞከር አይፍሩ። ዙሪያ ሽቦዎችን ይለውጡ ፣ አዲስ አካላትን ይጨምሩ ፣ አካላትን ያውጡ ፣ የኮድ መስመሮችን ይቀይሩ ፣ አዲስ መስመሮችን ይጨምሩ ፣ መስመሮችን ይሰርዙ እና ምን እንደሚከሰት ይመልከቱ! ማንኛውንም ነገር መስበር በጣም ከባድ ነው እና ከሰራ ማን ያስባል? ማይክሮ መቆጣጠሪያውን ጨምሮ እኛ የምንጠቀምበት ምንም ነገር በጣም ውድ እና ነገሮች እንዴት ሊወድቁ እንደሚችሉ ማየት ሁል ጊዜ ትምህርታዊ ነው። በሚቀጥለው ጊዜ ምን ማድረግ እንደሌለብዎት ማወቅ ብቻ ሳይሆን ፣ ከሁሉም በላይ ፣ ለምን እንደማያደርጉት ያውቃሉ። እንደ እኔ የሆነ ነገር ከሆንክ ፣ ልጅ በነበርክበት ጊዜ እና አዲስ አሻንጉሊት ከገዛህ ብዙም ሳይቆይ ቁርጥራጮቹን በትክክል እንዳስቀመጠው ለማየት ቁርጥራጮች ነበሩት? አንዳንድ ጊዜ መጫወቻው ሊጠገን በማይችል ሁኔታ ተጎድቷል ነገር ግን ትልቅ ችግር የለውም። አንድ ልጅ የእሱን የማወቅ ጉጉት እስከ ተሰበሩ መጫወቻዎች ድረስ እንኳን እንዲመረምር መፍቀድ ከእቃ ማጠቢያ ይልቅ ወደ ሳይንቲስት ወይም ወደ መሐንዲስነት ይለውጠዋል።

ዛሬ እኛ በጣም ቀለል ያለ ወረዳ እናሰራለን እና ከዚያ በንድፈ ሀሳብ ውስጥ ትንሽ ከባድ እንሆናለን። በዚህ ይቅርታ ፣ ግን መሣሪያዎቹ ያስፈልጉናል! በጣም ከባድ የሆነ የወረዳ ህንፃ የምንሠራበት እና ውጤቱ በጣም አሪፍ በሚሆንበት በመማሪያ 4 ውስጥ ይህንን እንደምናሟላ ቃል እገባለሁ። ሆኖም ፣ እነዚህን ሁሉ መማሪያዎች ማድረግ ያለብዎት መንገድ በጣም በዝግታ ፣ በማሰብ መንገድ ነው። እርስዎ ብቻ ካረሱ ፣ ወረዳውን ይገንቡ ፣ ኮዱን ይቅዱ እና ይለጥፉ እና ከዚያ ያሂዱ ፣ በእርግጥ ፣ ይሠራል ፣ ግን አንድ ነገር አይማሩም። ስለ እያንዳንዱ መስመር ማሰብ አለብዎት። ለአፍታ አቁም። ሙከራ። ፈጠራ። በዚያ መንገድ ካደረጉት በ 5 ኛው አጋዥ ስልጠና መጨረሻ ላይ አሪፍ ነገሮችን ከመገንባት ይቆያሉ እና ከእንግዲህ ማስተማር አያስፈልግዎትም። ያለበለዚያ እርስዎ ከመማር እና ከመፍጠር ይልቅ ዝም ብለው እየተመለከቱ ነው።

ለማንኛውም በቂ ፍልስፍና ፣ እንጀምር!

በዚህ መማሪያ ውስጥ ያስፈልግዎታል

  1. የእርስዎ ፕሮቶታይፕ ቦርድ
  2. አንድ LED
  3. ሽቦዎችን በማገናኘት ላይ
  4. ከ 220 እስከ 330 ohms አካባቢ ያለው ተከላካይ
  5. የመመሪያው ስብስብ መመሪያ-www.atmel.com/images/atmel-0856-avr-instruction-se…
  6. የመረጃ ዝርዝሩ www.atmel.com/images/Atmel-8271-8-bit-AVR-Microco…
  7. የተለየ ክሪስታል ማወዛወዝ (አማራጭ)

ወደ የተሟላ የማጠናከሪያ ትምህርት አገናኝ እዚህ አለ

ደረጃ 1 - ወረዳውን መገንባት

ወረዳውን በመገንባት ላይ
ወረዳውን በመገንባት ላይ

በዚህ መማሪያ ውስጥ ያለው ወረዳ እጅግ በጣም ቀላል ነው። እኛ የምንፈልገው “ብልጭ ድርግም” የሚለውን ፕሮግራም ለመፃፍ ነው ስለዚህ እኛ የምንፈልገው የሚከተለው ብቻ ነው።

LED ን ወደ PD4 ፣ ከዚያ ወደ 330 ohm resistor ፣ ከዚያ ወደ መሬት ያዙ። ማለትም

PD4 - LED - R (330) - GND

እና ያ ነው!

ፅንሰ -ሀሳቡ ግን ከባድ መሰናክል ይሆናል…

ደረጃ 2 - አስተያየቶቹ እና የ M328Pdef.inc ፋይል ለምን ያስፈልገናል?

የተካተተው ፋይል እና አስተያየቶቹ ለምን ጠቃሚ እንደሆኑ በማሳየት መጀመር ያለብን ይመስለኛል። አንዳቸውም በእርግጥ አስፈላጊ አይደሉም እና እርስዎ ያለ እነሱ በተመሳሳይ መንገድ ኮድ መጻፍ ፣ መሰብሰብ እና መስቀል ይችላሉ እና በትክክል በጥሩ ሁኔታ ይሠራል (ምንም እንኳን ያካተተ ፋይል ከሌለ ከአሰባሳቢው አንዳንድ ቅሬታዎች ሊያገኙ ይችላሉ - ግን ምንም ስህተቶች የሉም)

አስተያየቶቹን እና የፋይል ፋይልን ካላስወገድኩ በስተቀር ዛሬ የምንጽፈው ኮድ እዚህ አለ -

.መሣሪያ ATmega328P

.org 0x0000 jmp a.org 0x0020 jmp ea: ldi r16 ፣ 0x05 out 0x25 ፣ r16 ldi r16 ፣ 0x01 sts 0x6e ፣ r16 sei clr r16 out 0x26 ፣ r16 sbi 0x0a ፣ 0x04 sbi 0x0b ፣ 0x04 b: sbi 0x0b cbi 0x0b ፣ 0x04 rcall c rjmp bc: clr r17 d: cpi r17 ፣ 0x1e brne d ret e: inc r17 cpi r17 ፣ 0x3d brne PC+2 clr r17 reti

ቆንጆ ቀላል ትክክል? ሃሃ። ይህን ፋይል ሰብስበው ከሰቀሉ በ 1 ሴኮንድ ብልጭ ድርግም ብልጭታ 1/2 ሴኮንድ በሚቆይ ብልጭታ መካከል 1/2 ሰከንድ በሚቆይ ብልጭታዎች መካከል ለአፍታ እንዲቆም ያደርጋሉ።

ሆኖም ፣ ይህንን ኮድ መመልከቱ ብዙም የሚያበራ አይደለም። እርስዎ እንደዚህ ዓይነት ኮድ ቢጽፉ እና እሱን ለማሻሻል ወይም ለወደፊቱ እንደገና ለመጠቀም ከፈለጉ ፣ ይቸገራሉ።

ስለዚህ የተወሰነ ግንዛቤ እንዲኖረን አስተያየቶቹን እናስቀምጥ እና ፋይልን ወደ ውስጥ እናስገባ።

ደረጃ 3: Blink.asm

ዛሬ የምንወያይበት ኮድ እነሆ-

;************************************

; የተፃፈው በ: 1o_o7; ቀን;; ስሪት: 1.0; ፋይል የተቀመጠው እንደ: blink.asm; ለ AVR: atmega328p; የሰዓት ድግግሞሽ - 16 ሜኸ (አማራጭ) ፤ ********************************; የፕሮግራም funcion: ---------------------; LED ን በማብራት ሰከንዶች ይቆጥራል ፤; PD4 - LED - R (330 ohm) - GND;; --------------------------------------..ኖሊስት.መካተት "./m328Pdef.inc".ዝርዝር; ==============; መግለጫዎች.def temp = r16.def overflows = r17.org 0x0000; የማስታወሻ መቆጣጠሪያ rjmp ዳግም ማስጀመር (ፒሲ) ቦታ; jmp 2 ሲፒዩ ዑደቶች እና አርኤምኤም 1 ብቻ ያስከፍላል። ስለዚህ ከ 8 ኪ ባይት በላይ መዝለል ካልፈለጉ በስተቀር ፣ rjmp ብቻ ያስፈልግዎታል። አንዳንድ ማይክሮ መቆጣጠሪያዎች ስለዚህ ብቻ; rjmp እና jmp አይደለም.org 0x0020; የ Timer0 የትርፍ ፍሰት ተቆጣጣሪ rjmp overflow_handler የማስታወስ ቦታ; የሰዓት ቆጣሪ 0 የትርፍ ፍሰት መቋረጥ ከተከሰተ ወደዚህ ይሂዱ። የሰዓት መምረጫ ቢት CS00 ፣ CS01 ፣ CS02 ን ወደ 101 ያዘጋጁ። ይህ የሰዓት ቆጣሪ Counter0 ፣ TCNT0 ን ወደ FCPU/1024 ሞድ ውስጥ ያስገባል ፣ ስለዚህ በሲፒዩ ፍሪክ/1024 ldi temp ፣ 0b00000001 sts TIMSK0 ፣ temp ላይ ይቃኛል። የሰዓት ቆጣሪ የትርፍ ፍሰት መቋረጥን አንቃ (TOIE0) ቢት ያዘጋጁ። የሰዓት ቆጣሪ ማቋረጫ ጭምብል ምዝገባ (TIMSK0) sei; ዓለም አቀፍ ማቋረጫዎችን ያንቁ - ከ “sbi SREG ፣ I” clr temp out TCNT0 ፣ temp; የሰዓት ቆጣሪ/ቆጣሪውን ወደ 0 sbi DDRD ፣ 4; PD4 ን ወደ ውጤት ያዋቅሩ ፤ ======================; የፕሮግራሙ ዋና አካል ብልጭ ድርግም ይላል sbi PORTD ፣ 4; በ PD4 rcall መዘግየት ላይ LED ን ያብሩ; መዘግየት 1/2 ሰከንድ cbi PORTD ፣ 4 ይሆናል። በ PD4 rcall መዘግየት ላይ LED ን ያጥፉ ፤ መዘግየት 1/2 ሰከንድ rjmp ብልጭ ድርግም ይሆናል። ወደ መጀመሪያው መዘግየት ተመለስ - clr ሞልቷል። የተትረፈረፈ ፍሰት ወደ 0 ሰከንድ_ቁጥር: ሲፒፒ ሞልቷል ፣ 30; የተትረፈረፈ ብዛት እና የ 30 brne sec_count ን ያወዳድሩ ፤ ቅርንጫፍ ወደ ሰከንድ_ቁጥር ለመመለስ እኩል ካልሆነ ፣ 30 ጎርፍ መጥለቅለቅ ከተከሰተ ወደ ብልጭታ overflow_handler ይመለሱ: inc overflows; በተንሰራፋው ተለዋዋጭ ሲፒፒ 1 ላይ 1 ይጨምሩ ፣ 61; ከ 61 brne PC+2 ጋር ያወዳድሩ። የፕሮግራም ቆጣሪ + 2 (የሚቀጥለውን መስመር ይዝለሉ) ካልሆነ እኩል clr ሞልቷል። 61 የተትረፈረፈ ፍሰት ከተከሰተ ቆጣሪውን ወደ ዜሮ ሬታ እንደገና ያስጀምሩት ፣ ከተቋረጠ መመለስ

እንደሚመለከቱት ፣ የእኔ አስተያየቶች አሁን ትንሽ አጭር ናቸው። በመመሪያው ስብስብ ውስጥ ያሉት ትዕዛዞች ምን እንደሆኑ ካወቅን በኋላ በአስተያየቶች ውስጥ ያንን ማስረዳት አያስፈልገንም። ከፕሮግራሙ እይታ አንጻር ምን እየሆነ እንዳለ ማስረዳት አለብን።

ይህ ሁሉ በቁራጭ ምን እንደሚሠራ እንወያያለን ፣ ግን መጀመሪያ ዓለም አቀፋዊ እይታን ለማግኘት እንሞክር። የፕሮግራሙ ዋና አካል እንደሚከተለው ይሠራል።

በመጀመሪያ የ “PORTD” ን ቢት 4 በ “sbi PORTD ፣ 4” እናስቀምጠዋለን ይህ 1 ፒዲ 4 ን ይልካል ይህም ቮልቴጁን በዚያ ፒን ላይ ያስቀምጣል። ይህ LED ን ያበራል። ከዚያ 1/2 ሰከንድ ወደሚቆጥረው ወደ “መዘግየት” ንዑስ ክፍል እንዘልለዋለን (ይህንን እንዴት እንደ ሆነ በኋላ እናብራራለን)። ከዚያ በ PORTD ላይ ወደ ብልጭ ድርግም እና ጥርት 4 እንመለሳለን ፣ ይህም PD4 ን ወደ 0V ያዘጋጃል እና ስለሆነም LED ን ይዘጋዋል። ከዚያ ለሌላ 1/2 ሰከንድ እንዘገያለን ፣ እና ከዚያ በ “rjmp ብልጭ ድርግም” እንደገና ወደ ብልጭታ መጀመሪያ እንመለስ።

ይህንን ኮድ ማስኬድ እና የሚገባውን እንደሚያደርግ ማየት አለብዎት።

እና እዚያ አለዎት! ይህ ኮድ በአካል የሚሠራው ያ ብቻ ነው። የማይክሮ መቆጣጠሪያው የሚሠራው ውስጣዊ መካኒኮች በጥቂቱ ይሳተፋሉ እና ለዚህ ነው ይህንን መማሪያ የምናደርገው። ስለዚህ እያንዳንዱን ክፍል በተራ እንወያይ።

ደረጃ 4.org የመሰብሰቢያ መመሪያዎች

ቀደም ሲል ከነበሩት መማሪያዎቻችን. Nolist,.list,. ያካትታሉ እና.def ሰብሳቢው መመሪያዎች ምን እንደሚሠሩ አስቀድመን እናውቃለን ፣ ስለዚህ ከዚያ በኋላ የሚመጡትን 4 የኮድ መስመሮችን እንመልከት።

.org 0x0000

jmp ዳግም አስጀምር.org 0x0020 jmp overflow_handler

የ.org መግለጫው ቀጣዩን መግለጫ ለማስቀመጥ በ ‹ፕሮግራም ትዝታ› ውስጥ ለሰብሳቢው ይነግረዋል። የእርስዎ ፕሮግራም በሚፈጽምበት ጊዜ ፣ “የፕሮግራም ቆጣሪ” (እንደ ፒሲ አጠረ) የአሁኑን መስመር አድራሻ ይ containsል። ስለዚህ በዚህ ሁኔታ ፒሲው 0x0000 ላይ በሚሆንበት ጊዜ በዚያ ማህደረ ትውስታ ቦታ ውስጥ የሚኖረውን “jmp Reset” የሚለውን ትእዛዝ ያያል። በዚያ ቦታ ላይ jmp ዳግም ማስጀመርን የምንፈልግበት ምክንያት ፕሮግራሙ ሲጀመር ፣ ወይም ቺፕው እንደገና ሲጀመር ፣ ፒሲው በዚህ ቦታ ኮዱን መፈጸም ስለሚጀምር ነው። ስለዚህ ፣ እንደምናየው ፣ ወዲያውኑ “ዳግም አስጀምር” ወደተባለው ክፍል “ዘልለው” እንዲገቡ ነግረነዋል። ለምን እንዲህ አደረግን? ያ ማለት ከላይ ያሉት የመጨረሻዎቹ ሁለት መስመሮች እየተዘለሉ ነው ማለት ነው! እንዴት?

ደህና ፣ ነገሮች የሚስቡበት ያ ነው። በዚህ የማጠናከሪያ ትምህርት የመጀመሪያ ገጽ ላይ በጠቆምኩት ሙሉ ATmega328p የውሂብ ሉህ የፒዲኤፍ መመልከቻን መክፈት አለብዎት (ለዚያም ነው በ “እርስዎ ያስፈልግዎታል” ክፍል ንጥል 4 የሆነው)። የእርስዎ ማያ ገጽ በጣም ትንሽ ከሆነ ፣ ወይም ብዙ መስኮቶች ቀድሞውኑ ክፍት (እንደ እኔ ሁኔታ) እኔ የማደርገውን ማድረግ እና በኢሜተር ወይም በ Android ስልክዎ ላይ ማስቀመጥ ይችላሉ። የመሰብሰቢያ ኮድ ለመጻፍ ካቀዱ ሁል ጊዜ ይጠቀማሉ። በጣም አሪፍ ነገር ሁሉም ማይክሮ መቆጣጠሪያዎች በጣም በሚመሳሰሉ መንገዶች የተደራጁ መሆናቸው እና ስለዚህ የውሂብ ሉሆችን ለማንበብ እና ከእነሱ ኮድ መስጠትን ከተለማመዱ ለተለየ የማይክሮ መቆጣጠሪያ ተመሳሳይ ማድረግ በጣም ቀላል ሆኖ ያገኙትታል። ስለዚህ እኛ በእውነቱ እኛ ሁሉንም ማይክሮ መቆጣጠሪያዎችን በአስተማማኝ ሁኔታ እንዴት መጠቀም እንደሚቻል እንማራለን እና atmega328p ብቻ አይደለም።

እሺ ፣ በመረጃ ዝርዝሩ ውስጥ ወደ ገጽ 18 ዞር እና ስእል 8-2 ን ተመልከት።

በማይክሮ መቆጣጠሪያው ውስጥ የፕሮግራም ማህደረ ትውስታ በዚህ መንገድ ይዘጋጃል። በአድራሻ 0x0000 የሚጀምር እና በሁለት ክፍሎች የተከፈለ መሆኑን ማየት ይችላሉ። የትግበራ ብልጭታ ክፍል እና የማስነሻ ብልጭታ ክፍል። በአጭሩ ወደ ገጽ 277 ሠንጠረዥ 27-14 ካመለከቱ የመተግበሪያው ፍላሽ ክፍል ቦታዎቹን ከ 0x0000 ወደ 0x37FF እንደሚወስድ እና የቡት ፍላሽ ክፍሉ ቀሪዎቹን ቦታዎች ከ 0x3800 ወደ 0x3FFF እንደሚወስድ ያያሉ።

መልመጃ 1 በፕሮግራሙ ማህደረ ትውስታ ውስጥ ስንት ቦታዎች አሉ? ኢ. በ 0. መቁጠር ከጀመርን ጀምሮ 3FFF ን ወደ አስርዮሽ ይለውጡ እና 1 ይጨምሩ 1 እያንዳንዱ የማህደረ ትውስታ ቦታ 16 ቢት (ወይም 2 ባይት) ስፋት ያለው ስለሆነ አጠቃላይ የማስታወሻ ባይት ብዛት ምን ያህል ነው? አሁን በኪሎቢት ውስጥ 2^10 = 1024 ባይቶች እንዳሉ በማስታወስ ይህንን ወደ ኪሎቢት ይለውጡ። የማስነሻ ፍላሽ ክፍሉ ከ 0x3800 ወደ 0x37FF ይሄዳል ፣ ይህ ስንት ኪሎባይት ነው? ፕሮግራማችንን ለማከማቸት ስንት ኪሎባይት ማህደረ ትውስታ ለእኛ ይቀራል? በሌላ አነጋገር ፕሮግራማችን ምን ያህል ትልቅ ሊሆን ይችላል? በመጨረሻ ፣ ስንት የኮድ መስመሮች ሊኖረን ይችላል?

ደህና ፣ አሁን ስለ ፍላሽ ፕሮግራሙ ማህደረ ትውስታ አደረጃጀት ሁሉንም እናውቃለን ፣ ስለ.org መግለጫዎች ውይይታችንን እንቀጥል። የመጀመሪያው የማስታወሻ ቦታ 0x0000 ዳግም አስጀምር ብለን ወደሰየምንበት ክፍል ለመዝለል መመሪያችንን እንደያዘ እናያለን። አሁን የ ".org 0x0020" መግለጫ ምን እንደሚያደርግ እናያለን። በሚቀጥለው መስመር ላይ ያለው መመሪያ በማስታወሻ ቦታ 0x0020 ላይ እንዲቀመጥ እንፈልጋለን ይላል። እዚያ ያስቀመጥነው መመሪያ በእኛ ኮድ ውስጥ “overflow_handler” ብለን ወደሰየምንበት ክፍል መዝለል ነው… አሁን ይህ ዝላይ በማስታወስ ቦታ 0x0020 ላይ እንዲቀመጥ ለምን እንጠይቃለን? ለማወቅ ፣ በመረጃ ዝርዝሩ ውስጥ ወደ ገጽ 65 ዞረን ሠንጠረዥ 12-6ን እንመለከታለን።

ሠንጠረዥ 12-6 የ “ዳግም አስጀምር እና ማቋረጫ ቬክተሮች” ሠንጠረዥ ሲሆን “ማቋረጫ” ሲቀበል ፒሲው የት እንደሚሄድ በትክክል ያሳያል። ለምሳሌ ፣ የቬክተር ቁጥር 1 ን ከተመለከቱ ፣ የማቋረጫው “ምንጭ” “ዳግም ማስጀመር” (“RESET”) ነው ፣ እሱም “ውጫዊ ፒን ፣ የኃይል ማብሪያ ዳግም ማስጀመር ፣ ቡናማ-ዳግም ማስጀመር እና የክትትል ስርዓት ዳግም ማስጀመር” የሚል ትርጉም ካለው ፣ እነዚያ ነገሮች በማይክሮ መቆጣጠሪያችን ላይ ይከሰታሉ ፣ ፒሲ ፕሮግራማችንን በፕሮግራም ማህደረ ትውስታ ቦታ 0x0000 መፈጸም ይጀምራል። የእኛ የ.org መመሪያስ ታዲያ? ደህና ፣ እኛ በማስታወሻ ቦታ 0x0020 ላይ ትዕዛዝ ሰጥተናል እና ጠረጴዛውን ወደ ታች ከተመለከቱ የሰዓት ቆጣሪ/ቆጣሪ 0 ፍሰት ከተከሰተ (ከ TIMER0 OVF የሚመጣ) በ 0x0020 ላይ ያለውን ሁሉ ያስፈጽማል። ስለዚህ ያ በተከሰተ ቁጥር ፒሲው “overflow_handler” ብለን ወደሰየምንበት ቦታ ይዘልላል። አሪፍ ነው? ይህንን ለምን እንዳደረግን በደቂቃ ውስጥ ያያሉ ፣ ግን መጀመሪያ ይህንን የመማሪያውን ደረጃ ወደ ጎን እንጨርስ።

የእኛን ኮድ የበለጠ ሥርዓታማ እና ሥርዓታማ ለማድረግ ከፈለግን አሁን የምንወያይባቸውን 4 መስመሮችን በሚከተለው መተካት አለብን (ገጽ 66 ን ይመልከቱ)

.org 0x0000

rjmp ዳግም አስጀምር; ፒሲ = 0x0000 ሬታ; ፒሲ = 0x0002 reti; ፒሲ = 0x0004 reti; ፒሲ = 0x0006 ሬታ; ፒሲ = 0x0008 ሬታ; ፒሲ = 0x000A… ጡረታ; ፒሲ = 0x001E jmp overflow_handler: ፒሲ = 0x0020 ጡረታ: ፒሲ = 0x0022… reti; ፒሲ = 0x0030 ሬታ; ፒሲ = 0x0032

ስለዚህ የተሰጠ ማቋረጫ ቢከሰት ብቻ “ጡረታ” ማለት “ከማቋረጥ ይመለሱ” እና ሌላ ምንም ነገር አይከሰትም። ነገር ግን እነዚህን የተለያዩ ማቋረጦች ፈጽሞ “አንቃ” ካላደረግን እነሱ አይጠቀሙም እና በእነዚህ ቦታዎች ውስጥ የፕሮግራምን ኮድ ማስገባት እንችላለን። አሁን ባለው “blink.asm” ፕሮግራማችን የሰዓት ቆጣሪ 0 የትርፍ ፍሰት መቋረጥን (እና በእርግጥ ዳግም ማስጀመር ሁል ጊዜ የሚነቃውን ያቋርጣል) እና እኛ ከሌሎች ጋር አንጨነቅም።

የሰዓት ቆጣሪ 0 የትርፍ ፍሰት ከዚያ እንዴት “ማንቃት” እንችላለን? … በዚህ ትምህርት ውስጥ ቀጣዩ እርምጃችን ርዕሰ ጉዳይ ነው።

ደረጃ 5 ሰዓት ቆጣሪ/ቆጣሪ 0

ሰዓት ቆጣሪ/ቆጣሪ 0
ሰዓት ቆጣሪ/ቆጣሪ 0

ከላይ ያለውን ስዕል ይመልከቱ። አንዳንድ የውጭ ተጽዕኖዎች የፕሮግራማችንን ፍሰት ሲያስተጓጉሉ ይህ የ “ፒሲ” የውሳኔ አሰጣጥ ሂደት ነው። ማቋረጫ መከሰቱን ከውጭ ምልክት ሲያገኝ መጀመሪያ የሚያደርገው ለዚያ ዓይነት ማቋረጫ ‹ማቋረጫ አንቃ› የሚለውን ትንሽ አዘጋጅተን እንደሆነ ማረጋገጥ ነው። እኛ ከሌለን ፣ ቀጣዩን የኮድ መስመራችንን መፈጸሙን ይቀጥላል። ያንን ልዩ ማቋረጫ ቢት (ከ 0 ይልቅ በዚያ 1 ቦታ እንዲኖር) ካደረግን ከዚያ “ዓለም አቀፍ ማቋረጦች” ን እንደነቃን ወይም እንዳልነቃን ይፈትሻል ፣ ካልሆነ እንደገና ወደ ቀጣዩ መስመር ይሄዳል። ኮድ እና ቀጥል። እኛ ዓለም አቀፍ ማቋረጫዎችን እንዲሁ ከነቃን ፣ ከዚያ ወደዚያ ዓይነት ማቋረጫ (ወደ ሠንጠረዥ 12-6 እንደሚታየው) ወደ የፕሮግራሙ ማህደረ ትውስታ ቦታ ይሄዳል እና እኛ እዚያ ያደረግነውን ማንኛውንም ትዕዛዝ ያስፈጽማል። ስለዚህ ይህንን ሁሉ በእኛ ኮድ ውስጥ እንዴት እንደተገበርነው እንመልከት።

የእኛ ኮድ የተሰየመ ዳግም ማስጀመሪያ ክፍል በሚከተሉት ሁለት መስመሮች ይጀምራል።

ዳግም አስጀምር ፦

ldi temp ፣ 0b00000101 ከ TCCR0B ፣ temp

ቀደም ብለን እንደምናውቀው ፣ ይህ ወዲያውኑ የሚከተለውን ቁጥር ወደ ቴምፕ (ማለትም R16) ይጭናል ፣ ይህም 0b00000101 ነው። ከዚያ ይህንን ቁጥር “ውጭ” ትዕዛዙን በመጠቀም TCCR0B ተብሎ ለሚጠራው መዝገብ ይጽፋል። ይህ መዝገብ ምንድነው? ደህና ፣ ወደ የውሂብ ሉህ ገጽ 614 እንሂድ። ይህ ሁሉንም መመዝገቢያዎች በማጠቃለል በሰንጠረዥ መሃል ላይ ነው። በአድራሻ 0x25 ላይ TCCR0B ያገኛሉ። (በአስተያየቴ ባልተገለጸው የኮዱ ስሪት ውስጥ “0x25 ፣ r16” የሚለው መስመር ከየት እንደመጣ አሁን ያውቃሉ)። እኛ 0 ኛ ቢት እና 2 ኛ ቢት አዘጋጅተን ቀሪዎቹን በሙሉ እንዳጸዳነው ከላይ ባለው የኮድ ክፍል እናያለን። ጠረጴዛውን በመመልከት ይህ ማለት CS00 እና CS02 ን አዘጋጅተናል ማለት ነው። አሁን “8-bit Timer/Counter0 with PWM” በሚለው የውሂብ ሉህ ውስጥ ወደ ምዕራፍ እንሂድ። በተለይ ወደዚያ ምዕራፍ ገጽ 107 ይሂዱ። እኛ በመመዝገቢያ ማጠቃለያ ሠንጠረዥ ውስጥ ያየነውን “የሰዓት ቆጣሪ/ቆጣሪ ቁጥጥር መመዝገቢያ ቢ” (TCCR0B) መመዝገቢያ ተመሳሳይ መግለጫ ያያሉ (ስለዚህ እኛ በቀጥታ መምጣት እንችል ነበር ፣ ግን የማጠቃለያ ሰንጠረ howችን እንዴት እንደሚጠቀሙ ለማየት እፈልግ ነበር። ለወደፊቱ ማጣቀሻ)። የውሂብ ሉህ በዚያ መዝገብ ውስጥ ያሉትን የእያንዳንዱን ቢት መግለጫዎች እና የሚያደርጉትን መግለጫ መስጠቱን ይቀጥላል። ለአሁን ያንን ሁሉ ይዘለናል እና ገጹን ወደ ሠንጠረዥ 15-9 እናዞራለን። ይህ ሰንጠረዥ “የሰዓት ምረጥ ቢት መግለጫ” ያሳያል። እኛ በዚያ መዝገብ ውስጥ ካስቀመጥነው ቢት ጋር የሚስማማውን መስመር እስኪያገኙ ድረስ ያንን ጠረጴዛ ወደ ታች ይመልከቱ። መስመሩ “clk/1024 (ከመጠባበቂያ)” ይላል። ይህ ማለት Timer/Counter0 (TCNT0) በሲፒዩ ድግግሞሽ በ 1024 ተከፋፍሎ እንዲመዘገብ እንፈልጋለን። ማይክሮ መቆጣጠሪያችን በ 16 ሜኸ ክሪስታል ኦሲላተር ስለሚመገብ የእኛ ሲፒዩ መመሪያዎችን የሚያከናውንበት መጠን ማለት ነው። በሰከንድ 16 ሚሊዮን መመሪያዎች። ስለዚህ የእኛ የ TCNT0 ቆጣሪ የሚያስተካክለው መጠን ከዚያ 16 ሚሊዮን/1024 = 15625 ጊዜ በሰከንድ ነው (በተለያዩ የሰዓት መምረጫ ቢት ይሞክሩ እና ምን እንደሚሆን ይመልከቱ - የእኛን ፍልስፍና ያስታውሱ?)። ቁጥር 15625 ን በአዕምሯችን ጀርባ ላይ እናስቀምጥ እና ወደሚቀጥሉት ሁለት የኮድ መስመሮች እንሂድ -

ldi temp ፣ 0b00000001

STS TIMSK0 ፣ የሙቀት መጠን

ይህ TIMSK0 የተባለውን የመመዝገቢያ 0 ኛ ቢት ያዘጋጃል እና የተቀሩትን ሁሉ ያጸዳል። በመረጃ ዝርዝሩ ውስጥ ገጽ 109 ን ከተመለከቱ ፣ TIMSK0 ለ “ሰዓት ቆጣሪ/ቆጣሪ ማቋረጫ ጭንብል መመዝገቢያ 0” ን የሚያመለክት እና የእኛ ኮድ TOIE0 ተብሎ የሚጠራውን 0 ኛ ቢት አዘጋጅቶለታል። … እዚያ! አሁን ይህ ሁሉ ምን እንደሆነ ታያለህ። ከላይ በስዕላችን ላይ ከመጀመሪያው ውሳኔ እንደፈለግነው አሁን እኛ “ማቋረጫ የቢት ቅንብር” ን አግኝተናል። ስለዚህ አሁን እኛ ማድረግ ያለብን “ዓለም አቀፍ ማቋረጦች” ን ማንቃት ነው እና ፕሮግራማችን ለእነዚህ አይነት ማቋረጦች ምላሽ መስጠት ይችላል። እኛ በአጭር ጊዜ ውስጥ ዓለም አቀፍ ማቋረጫዎችን እናነቃለን ፣ ግን ያንን ከማድረጋችን በፊት በሆነ ነገር ግራ ተጋብተው ሊሆን ይችላል። እኔ ለምን ከተለመደው “ውጭ” ይልቅ በ TIMSK0 መዝገብ ውስጥ ለመቅዳት “sts” የሚለውን ትእዛዝ ተጠቀምኩ?

እኔ ማድረግ ያለብህ መጀመሪያ ማድረግ ያለብህ ነገር በመረጃ ወረቀቱ ውስጥ ወደ ገጽ 616 መዞር ነው። ይህ “የትምህርቱ ስብስብ ማጠቃለያ” ነው። አሁን እኔ የተጠቀምኩበትን “STS” የሚለውን መመሪያ ያግኙ። እሱ ከ R መዝገብ (እኛ R16 ን ተጠቀምን) እና “በቀጥታ ወደ SRAM ማከማቻ” ቦታ k (በእኛ ጉዳይ በ TIMSK0 የተሰጠ) ቁጥር ይወስዳል ይላል። ስለዚህ በ TIMSK0 ውስጥ ለማከማቸት 2 ሰዓት ዑደቶችን (በሠንጠረ last ውስጥ ያለውን የመጨረሻውን ዓምድ ይመልከቱ) የሚወስደውን “sts” መጠቀም ለምን አስፈለገን እና ከዚህ በፊት በ TCCR0B ውስጥ ለማከማቸት አንድ የሰዓት ዑደት ብቻ የሚወስደውን “መውጣት” ብቻ አስፈልገን ነበር? ይህንን ጥያቄ ለመመለስ በገጽ 614 ላይ ወደ መመዝገቢያ ማጠቃለያ ጠረጴዛችን መመለስ አለብን። የ TCCR0B መመዝገቢያ በአድራሻ 0x25 ላይ ግን (0x45) ላይ እንዳለ ይመለከታሉ? ይህ ማለት በ SRAM ውስጥ መመዝገቢያ ነው ፣ ግን እሱ ደግሞ ‹ወደብ› (ወይም i/o መዝገብ) ተብሎ የሚጠራ የተወሰነ የመዝገብ ዓይነት ነው። ከ “ውጭ” ትዕዛዙ አጠገብ ያለውን የማጠቃለያ ሰንጠረዥ ከተመለከቱ እንደ R16 ካሉ “የሥራ መመዝገቢያዎች” እሴቶችን ወስዶ ወደ ፖርት ይልካል። ስለዚህ ለ TCCR0B ስንጽፍ “ውጭ” ን መጠቀም እና እራሳችንን የሰዓት ዑደት ማዳን እንችላለን። አሁን ግን TIMSK0 ን በመመዝገቢያ ሠንጠረዥ ውስጥ ይፈልጉ። አድራሻ 0x6e እንዳለው ታያለህ። ይህ ከወደቦች ክልል ውጭ (የ SRAM የመጀመሪያዎቹ 0x3F ሥፍራዎች ብቻ ናቸው) እና ስለዚህ የ sts ትዕዛዙን ለመጠቀም እና እሱን ለማድረግ ሁለት የሲፒዩ የሰዓት ዑደቶችን መውሰድ አለብዎት። እባክዎን አሁን በገጽ 615 ላይ ባለው የማጠቃለያ ሰንጠረዥ መጨረሻ ላይ ማስታወሻ 4 ን ያንብቡ። እንዲሁም እንደ PORTD ያሉ ሁሉም የእኛ የግብዓት እና የውጤት ወደቦች በጠረጴዛው ታችኛው ክፍል ላይ እንደሚገኙ ልብ ይበሉ። ለምሳሌ ፣ PD4 በአድራሻ 0x0b ላይ ቢት 4 ነው (አሁን በአስተያየት ባልተሰጠው ኮዴ ውስጥ ሁሉም 0x0b ነገሮች ከየት እንደመጡ ያያሉ!) ይከሰታል? የእኛን ፍልስፍና አስታውስ! ስበረው! ለነገሮች ቃሌን ብቻ አይውሰዱ።

እሺ ፣ ከመቀጠላችን በፊት ፣ በአንድ የውሂብ ሉህ ውስጥ ወደ ገጽ 19 ያዙሩ። የውሂብ ማህደረ ትውስታ (SRAM) ስዕል ያያሉ። በ SRAM ውስጥ የመጀመሪያዎቹ 32 መመዝገቢያዎች (ከ 0x0000 እስከ 0x001F) እኛ በኮድዎ ውስጥ ሁል ጊዜ እንደ ተለዋዋጮች የምንጠቀምበት ‹አጠቃላይ ዓላማ የሥራ ምዝገባ› R0 እስከ R31 ነው።ቀጣዮቹ 64 መመዝገቢያዎች እስከ 0x005f የሚደርሱ የ I/O ወደቦች ናቸው (ማለትም እኛ እየተነጋገርናቸው ያሉት ከ “sts” ይልቅ “ውጭ” የሚለውን ትእዛዝ ልንጠቀምበት የምንችልባቸው በመመዝገቢያ ሠንጠረ in ውስጥ ከጎናቸው ያልታሸጉ አድራሻዎች አሏቸው)። የ SRAM ቀጣዩ ክፍል እስከ 0x00FF አድራሻ ድረስ በማጠቃለያ ሠንጠረዥ ውስጥ ሁሉንም ሌሎች መዝገቦችን ይይዛል ፣ እና በመጨረሻም ቀሪው ውስጣዊ SRAM ነው። አሁን በፍጥነት ፣ ወደ ገጽ 12 ለሰከንድ እንሸጋገር። እዚያ ሁል ጊዜ እንደ ተለዋዋጮቻችን የምንጠቀምበትን “አጠቃላይ ዓላማ የሥራ መዝገቦችን” ሰንጠረዥ ይመለከታሉ። በቁጥር R0 እስከ R15 እና ከዚያ R16 እስከ R31 መካከል ያለውን ወፍራም መስመር ታያለህ? ያ መስመር ነው እኛ ሁልጊዜ R16 ን እንደ ትንሹ የምንጠቀመው እና በሚቀጥለው ትምህርት ውስጥ ትንሽ ተጨማሪ የምገባበት እኛ ደግሞ ሶስት ባለ 16 ቢት ቀጥተኛ ያልሆነ የአድራሻ መመዝገቢያዎች ፣ X ፣ Y እና Z ያስፈልጉናል እኔ አልፈልግም። ምንም እንኳን አሁን ስለማያስፈልገን እና እዚህ በቂ እየተጨናነቅን ስለሆነ ወደዚያ ይግቡ።

የውሂብ ሉህ አንድ ገጽ ወደ ገጽ 11 መልሰው ያዙሩ። ከላይ በስተቀኝ በኩል የ SREG መዝገብ ሥዕላዊ መግለጫ ያያሉ? የዚያ መዝገብ ቢት 7 “እኔ” ተብሎ ይጠራል። አሁን ገጹን ወርደው የቢት 7 ን መግለጫ ያንብቡ… ዋው! እሱ ግሎባል ማቋረጫ አንቃ ቢት ነው። ከላይ ባለው ስዕላዊ መግለጫችን ውስጥ ሁለተኛውን ውሳኔ ለማለፍ እና በፕሮግራማችን ውስጥ የሰዓት ቆጣሪ/ቆጣሪ ከመጠን በላይ መቋረጥን ለመፍቀድ እኛ ማዘጋጀት ያለብን። ስለዚህ የፕሮግራማችን ቀጣዩ መስመር ማንበብ አለበት -

sbi SREG ፣ እኔ

በ “SREG” መዝገብ ውስጥ “እኔ” የተባለውን ትንሽ ያዘጋጃል። ሆኖም ፣ ከዚህ ይልቅ መመሪያውን ተጠቅመንበታል

sei

በምትኩ። ይህ ትንሽ በፕሮግራሞች ውስጥ ብዙ ጊዜ ተዘጋጅቷል ፣ እነሱ እሱን ለማድረግ ቀለል ያለ መንገድ አደረጉ።

እሺ! አንድ ሰው በተከሰተ ቁጥር የእኛ “jmp overflow_handler” እንዲገደል የትርፍ ፍሰት ማቋረጦች ለመሄድ ዝግጁ ነን።

ከመቀጠልዎ በፊት ፣ በጣም አስፈላጊ ስለሆነ የ SREG ምዝገባን (የሁኔታ መመዝገቢያ) በፍጥነት ይመልከቱ። እያንዳንዱ ባንዲራዎች የሚወክሉትን ያንብቡ። በተለይም እኛ የምንጠቀምባቸው ብዙ መመሪያዎች እነዚህን ባንዲራዎች ሁል ጊዜ ያዘጋጃሉ እና ይፈትሻሉ። ለምሳሌ ፣ በኋላ ላይ “ሲፒአይ” የሚለውን ትእዛዝ እንጠቀማለን ፣ እሱም “ወዲያውኑ ማወዳደር” ማለት ነው። ለዚህ መመሪያ የመመሪያ ማጠቃለያ ሰንጠረዥን ይመልከቱ እና በ “ባንዲራዎች” አምድ ውስጥ ምን ያህል ባንዲራዎች እንዳስቀመጡ ያስተውሉ። እነዚህ በ SREG ውስጥ ሁሉም ባንዲራዎች ናቸው እና የእኛ ኮድ ያዘጋጃቸዋል እና ያለማቋረጥ ይፈትሻቸዋል። በቅርቡ ምሳሌዎችን ያያሉ። በመጨረሻም የዚህ የኮድ ክፍል የመጨረሻው ቢት የሚከተለው ነው -

clr temp

ከ TCNT0 ፣ temp sbi DDRD ፣ 4

እዚህ የመጨረሻው መስመር በጣም ግልፅ ነው። PD4 ን ወደ ውጭ እንዲወጣ የሚያደርግ የ PortD የመረጃ አቅጣጫ ምዝገባን 4 ኛ ቢት ብቻ ያዘጋጃል።

የመጀመሪያው ተለዋዋጭውን የሙቀት መጠን ወደ ዜሮ ያዘጋጃል እና ከዚያ ወደ TCNT0 መዝገብ ይመዝግባል። TCNT0 የእኛ ሰዓት ቆጣሪ/Counter0 ነው። ይህ ወደ ዜሮ ያደርገዋል። ፒሲው ይህንን መስመር እንደፈፀመ ሰዓት ቆጣሪ 0 በዜሮ ይጀምራል እና በየሴኮንድ በ 15625 ጊዜ ይቆጥራል። ችግሩ ይህ ነው-TCNT0 “8-ቢት” መመዝገቢያ ትክክል ነው? ስለዚህ ባለ 8-ቢት መመዝገቢያ የሚይዘው ትልቁ ቁጥር ምንድነው? ደህና 0b11111111 ነው። ይህ ቁጥር 0xFF ነው። የትኛው 255. ስለዚህ ምን እንደሚሆን ታያለህ? የሰዓት ቆጣሪው በሰከንድ 15625 ጊዜ እየጨመረ በመሄድ እና 255 በደረሰ ቁጥር “ይፈስሳል” እና እንደገና ወደ 0 ይመለሳል። ወደ ዜሮ ሲመለስ በተመሳሳይ ጊዜ የሰዓት ቆጣሪ የትርፍ ፍሰት መቋረጥ ምልክት ይልካል። ፒሲው ይህንን ያገኛል እና አሁን ምን እንደሚያደርግ ያውቃሉ? አዎ። ወደ ፕሮግራም ማህደረ ትውስታ ቦታ 0x0020 በመሄድ እዚያ ያገኘውን መመሪያ ያስፈጽማል።

በጣም ጥሩ! አሁንም ከእኔ ጋር ከሆኑ ታዲያ የማይደክም ልዕለ ኃያል ነዎት! እንቀጥል…

ደረጃ 6 - የተትረፈረፈ ተቆጣጣሪ

ስለዚህ የሰዓት ቆጣሪ/ቆጣሪ 0 መመዝገቢያው አሁን ሞልቷል ብለን እናስብ። አሁን ፕሮግራሙ የማቋረጫ ምልክት እንደሚቀበል እና 0x0020 ን እንደሚፈጽም እናውቃለን ለፕሮግራሙ ቆጣሪ ፣ ፒሲ ወደ “overflow_handler” የሚል ስያሜ እንዲዘል የሚከተለው ከዚያ መለያ በኋላ የጻፍነው ኮድ ነው።

የተትረፈረፈ_አደራጅ ፦

inc overflows cpi overflows ፣ 61 brne PC+2 clr overflows reti

እሱ የሚያደርገው የመጀመሪያው ነገር ተለዋዋጭውን “የተትረፈረፈ” (ማለትም የእኛ ስም ለጠቅላላ ዓላማ የሥራ ምዝገባ R17) ማሳደግ ነው ፣ ከዚያ የተትረፈረፈ ይዘትን ከ 61 ቁጥር ጋር “ያወዳድራል”። መመሪያው ሲፒ የሚሠራበት መንገድ በቀላሉ መቀነስ ነው። ሁለቱ ቁጥሮች እና ውጤቱ ዜሮ ከሆነ የ Z ባንዲራ በ SREG መዝገብ ውስጥ ያስቀምጣል (ይህንን መዝገብ ሁል ጊዜ እናያለን አልኩዎት)። ሁለቱ ቁጥሮች እኩል ከሆኑ የ Z ባንዲራ 1 ይሆናል ፣ ሁለቱ ቁጥሮች እኩል ካልሆኑ 0 ይሆናል።

ቀጣዩ መስመር “brne PC+2” የሚል ሲሆን ትርጉሙም “እኩል ካልሆነ ቅርንጫፍ” ማለት ነው። በዋናነት ፣ በ ZREG ውስጥ የ Z ን ባንዲራ ይፈትሻል እና አንድ ካልሆነ (ማለትም ሁለቱ ቁጥሮች እኩል አይደሉም ፣ እነሱ እኩል ቢሆኑ ፣ ዜሮ ባንዲራ ይቀመጣል) የፒሲ ቅርንጫፎች ወደ ፒሲ+2 ፣ ማለትም ቀጣዩን ይዘልላል ማለት ነው። መስመር እና ቀጥታ ወደ “ጡረታ” ይሄዳል ፣ ይህም መቋረጫው ሲደርስ ከማቋረጫው ወደ ኮዱ ውስጥ ወዳለው የትኛውም ቦታ ይመለሳል። የብሩህ መመሪያ በዜሮ ባንዲራ ቢት 1 ን ካገኘ ቅርንጫፍ አይሆንም እና ይልቁንም ወደ 0 በማዋቀር ላይ የሚጥለቀለቀው ወደሚቀጥለው መስመር ይቀጥላል።

የዚህ ሁሉ የተጣራ ውጤት ምንድነው?

ደህና ፣ የሰዓት ቆጣሪ በተሞላ ቁጥር ይህ ተቆጣጣሪ የ “ሞላ” ፍሰትን ዋጋ በአንድ ይጨምራል። ስለዚህ ተለዋዋጩ “ተትረፍርፎ” በሚከሰቱበት ጊዜ የተትረፈረፈውን ብዛት እየቆጠረ ነው። ቁጥር 61 በደረሰ ቁጥር ወደ ዜሮ እናስተካክለዋለን።

አሁን በዓለም ውስጥ ለምን እንደዚያ እናደርጋለን?

እስኪ እናያለን. ለሲፒዩአችን የሰዓት ፍጥነታችን 16 ሜኸ መሆኑን እናስታውስ እና TCCR0B ን በመጠቀም “ቅድመ ጥንቃቄ አድርገናል” ስለዚህ ሰዓት ቆጣሪው በ 15625 ቆጠራ በሰከንድ ቀኝ ብቻ እንዲቆጠር? እና ሰዓት ቆጣሪው ቁጥር 255 በሚደርስ ቁጥር ይፈስሳል። ስለዚህ ያ ማለት 15625/256 = 61.04 ጊዜ በሰከንድ ይሞላል። እኛ ከተለዋዋጭ “ተትረፍርፎ” ጋር የተትረፈረፈውን ብዛት እየተከታተልን እና ያንን ቁጥር ከ 61 ጋር እያነጻጸርነው ነው። ስለዚህ “ተትረፈረፈ” በየሴኮንድ አንዴ 61 እኩል ይሆናል ብለን እናያለን! ስለዚህ የእኛ ተቆጣጣሪ በየሰከንዱ አንድ ጊዜ “የተትረፈረፈ” ን ወደ ዜሮ ያስተካክላል። ስለዚህ በቀላሉ ተለዋዋጭውን “ተትረፍርፎ” የምንቆጣጠር እና ወደ ዜሮ በሚመለስበት እያንዳንዱ ጊዜ ልብ ብለን የምናስተውል ከሆነ በእውነተኛ ሰዓት ውስጥ በሰከንድ-ሰከንድ እንቆጥራለን (ልብ ይበሉ በሚቀጥለው ትምህርት ውስጥ የበለጠ ትክክለኛ እንዴት እንደሚያገኙ እናሳያለን። የአሩዲኖ “መዘግየት” መደበኛ ሥራ በሚሠራበት መንገድ በሚሊሰከንዶች መዘግየት)።

አሁን የሰዓት ቆጣሪው የትርፍ ፍሰት አቋርጦ “አስተናግደናል”። ይህ እንዴት እንደሚሰራ መረዳቱን ያረጋግጡ እና ከዚያ ይህንን እውነታ ወደምንጠቀምበት ወደሚቀጥለው ደረጃ ይቀጥሉ።

ደረጃ 7: መዘግየት

አሁን የእኛ የሰዓት ቆጣሪ መቋረጫ አስተናጋጅ “overflow_handler” አሠራሩ ተለዋዋጭውን “ተትረፍርፎ” ን ወደ ሴኮንድ አንዴ እንደሚያቀናጅ ከተገነዘብን ይህንን እውነታ የ “መዘግየት” ንዑስ መርሃ ግብር ለመቅረጽ እንችላለን።

ከመዘግየታችን በታች የሚከተለውን ኮድ ይመልከቱ -መለያ

መዘግየት

clr overflows sec_count: cpi overflow, 30 brne sec_count ret

በፕሮግራማችን ውስጥ መዘግየት በፈለግን ቁጥር ይህንን ንዑስ ክፍል እንጠራዋለን። የሚሠራበት መንገድ መጀመሪያ ተለዋዋጭውን “ከመጠን በላይ” ወደ ዜሮ ያዘጋጃል። ከዚያ “ሰከንድ_ቁጥር” ተብሎ ወደተሰየመበት ክልል ውስጥ ገብቶ ከመጠን በላይ ሞልቶ ከ 30 ጋር ያወዳድራል ፣ እነሱ እኩል ካልሆኑ ወደ ስያሜ_ቁጥር ተመልሶ ቅርንጫፎቹን እንደገና ያወዳድራል ፣ እና እንደገና ያወዳድራል ፣ በመጨረሻም እስኪያገኙ ድረስ (ይህ ሁሉ ጊዜ እንደሚሄድ ያስታውሱ) በእኛ የጊዜ ቆጣሪ ማቋረጫ ተቆጣጣሪ ላይ ተለዋዋጭውን ሞልቶ መጨመሩን ቀጥሏል እና ስለዚህ እዚህ በዞርን ቁጥር እየተለወጠ ነው። ከመጠን በላይ ሲፈስ 30 እኩል ሲሆን ከሉፕው ወጥቶ መዘግየት ብለን ወደጠራንበት ቦታ ሁሉ ይመለሳል - ከ። የተጣራ ውጤቱ የ 1/2 ሰከንድ መዘግየት

መልመጃ 2 - የተትረፈረፈ -ተቆጣጣሪ አሰራሩን ወደሚከተለው ይለውጡ

የተትረፈረፈ_አደራጅ ፦

inc overflows reti

እና ፕሮግራሙን ያሂዱ። የተለየ ነገር አለ? ለምን ወይም ለምን?

ደረጃ 8 ፦ ብልጭ ድርግም

በመጨረሻ እስቲ ብልጭ ድርግም የሚለውን እንመልከት -

ብልጭ ድርግም

sbi PORTD ፣ 4 rcall መዘግየት cbi PORTD ፣ 4 rcall መዘግየት rjmp ብልጭ ድርግም ይላል

መጀመሪያ PD4 ን እናበራለን ፣ ከዚያ የእኛን መዘግየት ንዑስ ክፍል እንጠራዋለን። ፒሲው ወደ “ሪት” መግለጫ ሲደርስ rcall ን ተከትሎ ወደ መስመሩ እንዲመለስ rcall ን እንጠቀማለን። ከዚያ እኛ እንዳየነው በትርፍ ፍሰት ተለዋዋጭ ውስጥ ለ 30 ቆጠራዎች የመዘግየቱ መደበኛ መዘግየቶች ይህ ማለት በትክክል 1/2 ሰከንድ ያህል ነው ፣ ከዚያ PD4 ን እናጠፋለን ፣ ሌላ 1/2 ሰከንድ እናዘገያለን ፣ ከዚያ እንደገና ወደ መጀመሪያው እንመለሳለን።

የተጣራ ውጤቱ ብልጭ ድርግም የሚል LED ነው!

እኔ “ብልጭ ድርግም” ምናልባት በስብሰባ ቋንቋ ውስጥ የተሻለው “የሰላም ዓለም” ፕሮግራም አይደለም ብለው የሚስማሙ ይመስለኛል።

መልመጃ 3 - በፕሮግራሙ ውስጥ ያሉትን የተለያዩ መመዘኛዎች ይለውጡ ፣ ምክንያቱም ኤልኢዲ እንደ ሴኮንድ ወይም 4 ጊዜ በሰከንድ ፣ ወዘተ በተለያዩ መጠኖች ብልጭ ድርግም ይላል ፣ መልመጃ 4 ፦ LED ለተለያዩ የጊዜ ገደቦች እንዲበራ እና እንዲጠፋ ይለውጡት። ለምሳሌ ለ 1/4 ሰኮንድ በርቷል እና ከዚያ ለ 2 ሰከንዶች ወይም እንደዚህ ያለ ነገር ይለማመዱ 5 ፦ የ TCCR0B የሰዓት መምረጫ ነጥቦችን ወደ 100 ይለውጡ እና ከዚያ ወደ ጠረጴዛው መውጣትዎን ይቀጥሉ። ከመማሪያ 1 የእኛ “hello.asm” መርሃ ግብር በየትኛው ነጥብ ላይ አይለይም? መልመጃ 6 (አማራጭ) - እንደ 4 ሜኸ ወይም 13.5 ሜኸዝ ወይም ሌላ ያለ ሌላ ክሪስታል ማወዛወዝ ካለዎት ፣ የእርስዎን 16 ሜኸዝ ማወዛወጫ ይለውጡ። ለአዲሱ በዳቦ ሰሌዳዎ ላይ እና ያ እንዴት የ LED ብልጭ ድርግም በሚለው ፍጥነት ላይ ተጽዕኖ እንደሚያሳድር ይመልከቱ። አሁን በትክክለኛው ስሌት ውስጥ ማለፍ እና ተመን ላይ ምን ያህል እንደሚጎዳ በትክክል መተንበይ አለብዎት።

ደረጃ 9 መደምደሚያ

እስከዚህ ድረስ ላደረጋችሁት ለከባድ ሞት ፣ እንኳን ደስ አለዎት!

እርስዎ ብዙ ንባብ ሲያደርጉ እና ከፍ ሲያደርጉ እና ሲሞክሩ ሲመለከቱ በጣም ከባድ መሆኑን መገንዘቤን እገነዘባለሁ ግን የሚከተሉትን አስፈላጊ ነገሮች እንደተማሩ ተስፋ አደርጋለሁ።

  1. የፕሮግራም ማህደረ ትውስታ እንዴት እንደሚሰራ
  2. SRAM እንዴት እንደሚሰራ
  3. መዝገቦችን እንዴት እንደሚመለከቱ
  4. መመሪያዎችን እንዴት መፈለግ እና የሚያደርጉትን ማወቅ
  5. ማቋረጫዎችን እንዴት መተግበር እንደሚቻል
  6. ሲፒው ኮዱን እንዴት እንደሚፈጽም ፣ SREG እንዴት እንደሚሠራ ፣ እና በማቋረጦች ጊዜ ምን እንደሚሆን
  7. ቀለበቶችን እና መዝለሎችን እንዴት ማድረግ እና በኮዱ ውስጥ ዙሪያውን መዝለል
  8. የውሂብ ሉህ ማንበብ ምን ያህል አስፈላጊ ነው!
  9. ለአትሜጋ 328 ፒ ማይክሮ መቆጣጠሪያ እንዴት ይህን ሁሉ ማድረግ እንደሚችሉ አንዴ እርስዎ የሚያውቁትን ማንኛውንም አዲስ ተቆጣጣሪዎች ለማወቅ ዘመድ ኬክ መራመድ ይሆናል።
  10. የሲፒዩ ጊዜን ወደ እውነተኛ ጊዜ እንዴት እንደሚለውጡ እና በማዘግየት ልምዶች ውስጥ ይጠቀሙበት።

አሁን እኛ ብዙ ፅንሰ -ሀሳብ ስላለን የተሻለ ኮድ መጻፍ እና በጣም የተወሳሰቡ ነገሮችን መቆጣጠር እንችላለን። ስለዚህ የሚቀጥለው ትምህርት እኛ ያንን እናደርጋለን። የበለጠ የተወሳሰበ ፣ የበለጠ ሳቢ ፣ ወረዳ እንገነባለን እና በአስደሳች መንገዶች እንቆጣጠረዋለን።

መልመጃ 7 - ኮዱን በተለያዩ መንገዶች “ይሰብሩ” እና ምን እንደሚከሰት ይመልከቱ! ሳይንሳዊ የማወቅ ጉጉት ያለው ሕፃን! ሌላ ሰው ምግቦቹን በትክክል ማጠብ ይችላል? መልመጃ 8-የዝርዝር ፋይል ለማመንጨት “-l” የሚለውን አማራጭ በመጠቀም ኮዱን ያሰባስቡ። ኢ. "avra -l blink.lst blink.asm" እና የዝርዝሩን ፋይል ይመልከቱ። ተጨማሪ ክሬዲት-መጀመሪያ ላይ የሰጠሁት አስተያየት ያልተሰጠበት ኮድ እና በኋላ የምንወያይበት የአስተያየት ኮድ ይለያያል! የተለየ የኮድ መስመር አለ። ሊያገኙት ይችላሉ? ይህ ልዩነት ለምን አስፈላጊ አይደለም?

እንደተደሰቱ ተስፋ ያድርጉ! በሚቀጥለው ጊዜ እንገናኝ…

የሚመከር: