سؤال

أنا جديد إلى حد ما على ميكروكنترولر البرمجة.لدي بعض الخبرة مع اردوينو ، ولكن بعد أن كنت قد انتهيت تقريبا مشروعي ، وأنا خداع لنقل مشروعي الحالي إلى شيء أرخص وأصغر.لذلك أنا الآن باستخدام أفر أتميغا 32 مع أتميل ستوديو.

أحاول استخدام أتميغا 32 للتواصل مع شريحة ماكس 7219 لمضاعفة مع مصفوفة ليد.ومع ذلك ، لدي العديد من الأجهزة المختلفة التي أريد التواصل معها.

كيف يمكنني التواصل مع الجهاز دون فعلا باستخدام دبابيس سبي المقدمة على متحكم?لقد قمت بعمل مشروع اختبار ، ولكن يبدو أن هناك شيئا خاطئا ولا يمكنني معرفة ما هي المشكلة.أعتقد أنني تمكنت من الحصول عليه في وضع الاختبار ، لأن جميع المصابيح مضاءة ، لكن لا يمكنني الحصول عليها لفعل أي شيء بعد ذلك.لا أستطيع حتى مسح الشاشة / إغلاقها.لقد راجعت الأسلاك مرة أخرى.هل الترميز الخاص بي ربما غير صحيح فيما يتعلق بتكوين الدبوس وتعيين الدبابيس?هل هناك أي اقتراحات لهذا أو طريقة أفضل لكتابة التعليمات البرمجية الخاصة بي?

هنا هو الرابط إلى ما7219 ورقة البيانات

//test

#include <avr/io.h>


int main(void)
{

DDRB = 0b00000111; // pin 1(data), 2(clock) and 3(latch) are outputs

PORTB = 0 << PINB0; // data pin 1 is low
PORTB = 0 << PINB1; // clock pin 2 is low
PORTB = 0 << PINB2; // latch pin 3 is low

uint16_t data;
data = 0b0000110000000000; // data to shift out to the max7219

 //read bit
uint16_t mask;
 for (mask = 0b0000000000000001; mask>0; mask <<= 1) 
{ 
    //iterate through bit mask
    if (data & mask)
    { // if bitwise AND resolves to true
        // send one
        PORTB = 1 << PINB0;
        // tick
        PORTB = 1 << PINB1;
        // tock
        PORTB = 0 << PINB1;
    }
     else{ //if bitwise and resolves to false
        // send 0
        // send one
        PORTB = 0 << PINB0;
        // tick
        PORTB = 1 << PINB1;
        // tock
        PORTB = 0 << PINB1;
    }

}

PORTB = 1 << PINB2; // latch all the data
PORTB = 1 << PINB0; // data pin 1 is high
PORTB = 0 << PINB1; // clock pin 2 is low
PORTB = 0 << PINB2; // latch pin 3 is low
}
هل كانت مفيدة؟

المحلول

نعم ، رمز بت الانفجار الخاص بك لديه مشكلة في أنك تعيين قيمة كاملة من السجل في كل مرة دون الحفاظ على القيمة الحالية.ومن ثم يمكنك محو إشارة البيانات الخاصة بك في اللحظة التي تقود فيها ساعتك ، منتهكة وقت الانتظار لجهاز الاستقبال وتؤدي إلى عملية غير متوقعة.

بدلا من تعيين دبابيس مع =, ، يجب أن تضعهم مع |= أو مسح لهم مع &= ~(value)

على سبيل المثال:

     PORTB = 1 << PINB0;      //drive data
    // tick
    PORTB |= 1 << PINB1;      //clock high PRESERVING data
    // tock
    PORTB &= ~(1 << PINB1);   //clock low

قد تحتاج أيضا إلى إدخال تأخير طفيف بين عمليات الدبوس.

من الناحية الفنية ، بالنظر إلى أنك تستخدم بالفعل if بالنسبة لحالة البيانات ، يمكنك أيضا إعادة تشغيل إشارة البيانات باستخدام أو في المهمة ، على سبيل المثال

if (data & mask)
{ // if bitwise AND resolves to true
    // send one
    PORTB = 1 << PINB0;
    // tick
    PORTB = (1 << PINB1) | (1 << PINB0);
    // tock
    PORTB = 0 << PINB1 | (1 << PINB0);
}
 else{ //if bitwise and resolves to false
    // send 0
    // send one
    PORTB = 0 << PINB0;
    // tick
    PORTB = 1 << PINB1;
    // tock
    PORTB = 0 << PINB1;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top