ATtiny13のUARTまたは52pのMKからのデータを表示する方法

(発行時のチップアンドディップストア10個の価格)



さまざまな電子部品を買うことに抵抗することはできませんでしたが、10個の非常に小さな MKを手に入れました。 ATtiny13が大好き-安くて陽気な。 私がそれらを買ったとき、私は彼らが「タイマーのようではなく、ADCでさえも」を持っていることをしっかりと思い出し、そして彼らの低価格にとても満足していました。

ただし、実際のタスクでATtiny13をプッシュしたとき、データ転送用のインターフェイス (もちろん、GPIOはカウントしません)という重要なものは1つもありませんでした。 さて、GPIOがあれば、必要なものは何でも書くことができます! 私はグーグルに行き、グーグルに行きました...そして、私はavr-gccの美しい既製のソリューションをグーグルしませんでした...そのようなソリューションを作成することについて(願っています)、この記事はcatに歓迎されています。



実際、約3つのオプションがグーグルで検索されましたが、 1つはBASIC(私はそれが可能であるとは知りませんでした)、 もう1つはCVAVR(最初の点滅LEDのハロー)で記述し、一般に怖いアセンブラーにはすべてのセマンティックコードがありますが、 3つ目のオプションそれが近づいているようだ...しかし、いくつかの非常に奇妙なコード...しかし、spolinkは獲得しています。 しかし、脂肪...

プログラムメモリ使用量:508バイト49.6%フル


さて、大丈夫、主なものは動作してフィットし、そこであなたはすでに読んでリファクタリングすることができます... JumpStartが行われました-これが主なものです。







コードをよく読んだ後、その作者は深い尊敬に値することが明らかになります...このコードは、ごく最近プログラムした人のコードに似ており、問題は非常に強力に解決されています。 同じように機能します。 私は本当に初心者にいくつかの些細な間違いを説明してほしかったのですが、3回目以降はそれが非常に主題外であることに気づきました。



オリジナルでは、コードはデータの送受信に従事していましたが、実際には、私のタスクは受信を必要としません(特にメインループで)。 ピン変更割り込みをレッグでキャッチし、A-> D変換の結果を吐き出すだけです。 したがって、体重を減らすために、レセプションを切ることにしました。 それほど長くない、あまり考えられないリファクタリングの後に起こったことは次のとおりです。



#define F_CPU 9600000UL #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> uint8_t temp, count, start; volatile uint8_t c; #define BAUD_C 123 #define TxD PB4 #define T_START TCCR0B = (1 << CS01) // F_CPU/8 #define T_STOP TCCR0B = 0 #define T_RESET TCNT0 = 0 ISR(TIM0_COMPA_vect){ OCR0A = BAUD_C; c = 1; T_RESET; } void send(uint8_t data) { //   "lov"? 0_ if (count >= 8) { PORTB |= (1<<TxD); start = 0; temp = 0; c = 0; count = 0; T_STOP; OCR0A = 0; return; } if(c == 1) { if (start == 0) { temp = 0x80; start = 1; count--; } else { temp = data; temp = temp >> count; temp = temp << 7; } switch(temp) { case 0x80 : PORTB &= ~(1 << TxD); break; case 0 : PORTB |= (1 << TxD); break; } count++; c = 0; } } void send_ch(uint8_t data){ uint8_t f; data = ~data; T_START; for(f = 0; f < 10; f++){ while(c == 0); send(data); } }
      
      







あまり考えたくないので、意味部分全体をそのままにして、 TIMSK0 = 0x04のような余分で微調整されたvyrviglazyの部分を捨てました 。 このコードでは、間隔の実装が本当に気に入りました! ボーレートの定数を計算するすべてのhemoは、ほぼ実験的に選択され、クォーツの不正確さに応じて調整される1つのBAUD_C数になります(著者にとっては115であり、スクリーンショットで非常に正確に動作するようです。 ) おそらく、これは最も最適で、信頼でき、真の何とか何とか何とか決定ではありませんが、私には非常にシンプルで美しいようです!

さて、結果は何ですか?

プログラムメモリ使用量:304バイト29.7%フル


「ええ、私たちは生きています。 ADCにとっても十分です...」しかし、一般的に、これで終わりではありません。 これでコードは1文字のみを送信できますが、文字列を転送して値を登録する必要があります。 それでは、古いプロジェクトを調べましょう! この問題は、UARTのないMKに固有のものではなくなり、繰り返し解決されています。



 void send_str(char *text){ while(*text) { send_ch(*text++); } } void itoa(uint16_t n, char s[]) { uint8_t i = 0; do { s[i++] = n % 10 + '0'; } while ((n /= 10) > 0); s[i] = '\0'; // Reversing uint8_t j; char c; for (i = 0, j = strlen(s)-1; i<j; i++, j--) { c = s[i]; s[i] = s[j]; s[j] = c; } } void send_num(char *text, uint16_t n){ char s[6]; itoa((uint16_t)n, s); send_str(text); send_str(s); }
      
      







番号の種類の説明を付けてすぐに番号を転送することは非常に便利なので、 send_num(char * text、uint16_t n)

そして、使用例を示します:



 int main(void){ DDRB |= (1 << TxD); TIMSK0 = (1 << OCIE0A); sei(); while(1){ _delay_ms(1); send_num("Habr:", 4242); } }
      
      







わかった

プログラムメモリ使用量:538バイト52.5%フル


オリジナルより少しだけ。 しかし、どれほど便利なのでしょう!





美しく人気のある記事を作成するという目標がなかったことをすぐに警告したいと思います。 それは非常に迅速に書かれ、非常にわずかに再読され、非常に間違いを含む可能性があります。 トロールしないようにお願いします-すべてを修正します。 主なことは、この問題が存在しなくなり、ATtiny13にセンサーを構築したい人は誰でも、インターフェイスの既製のソリューションを持っているということです。



PS:最初はI2Cを見て、非常に有望なリポジトリを見つけましたが、Atmel Studioがオーバーフローと言う理由を理解していませんでした。 このインターフェイスをt13にスナップするのもいいですね。さらに悪化するかもしれません...しかし、それは私ではありません。



PSS: 私の論理アナライザー 。 彼はゴージャスです!



All Articles