كيف يمكنني إصلاح هذا الرمز للسماح لـ AVR بالتحدث عبر المنفذ التسلسلي؟

StackOverflow https://stackoverflow.com/questions/846206

  •  21-08-2019
  •  | 
  •  

سؤال

لقد تم سحب شعري مؤخرًا في محاولة للحصول على Atmega162 على STK200 الخاص بي للتحدث إلى جهاز الكمبيوتر الخاص بي عبر RS232. راجعت وتأكدت من أن STK200 يحتوي على شريحة MAX202CPE.

لقد قمت بتكوين الشريحة لاستخدام الساعة 8MHz الداخلية وتقسيمها على 8.

لقد حاولت نسخ الكود من ورقة البيانات (وقمت بتغييرات حيث اشتكى المترجم) ، ولكن دون جدوى.

الكود الخاص بي أدناه ، هل يمكن لشخص ما مساعدتي في إصلاح المشكلات التي أواجهها؟

لقد أكدت أن منفذ التسلسلي الخاص بي يعمل على أجهزة أخرى وليس معيبًا.

شكرًا!

#include <avr/io.h>
#include <avr/iom162.h>

#define BAUDRATE 4800

void USART_Init(unsigned int baud)
{
    UBRR0H = (unsigned char)(baud >> 8);
    UBRR0L = (unsigned char)baud;

    UCSR0B = (1 << RXEN0) | (1 << TXEN0);

    UCSR0C = (1 << URSEL0) | (1 << USBS0) | (3 << UCSZ00);
}

void USART_Transmit(unsigned char data)
{
    while(!(UCSR0A & (1 << UDRE0)));

    UDR0 = data;
}

unsigned char USART_Receive()
{
    while(!(UCSR0A & (1 << RXC0)));

    return UDR0;
}

int main()
{

    USART_Init(BAUDRATE);

    unsigned char data;

    // all are 1, all as output
    DDRB = 0xFF;

    while(1)
    {
        data = USART_Receive();

        PORTB = data;

        USART_Transmit(data);


    }
}
هل كانت مفيدة؟

المحلول 4

بعد قراءة ورقة البيانات بشكل أكثر شمولية ، كنت أقوم بتعيين الباودات بشكل غير صحيح. تحتوي ورقة بيانات ATMEGA162 على مخطط لترددات الساعة الموضحة مقابل معدلات الباود والخطأ المقابل.

بالنسبة لمعدل 4800 باود وتردد ساعة 1 ميجا هرتز ، كان الخطأ 0.2 ٪ ، وهو أمر مقبول بالنسبة لي. كانت الحيلة تمر 12 إلى وظيفة USART_INIT () ، بدلاً من 4800.

آمل أن يساعد هذا شخص آخر!

نصائح أخرى

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

فيما يلي تمهيدي سريع للغاية ، لا شك أنه يمكنك العثور على شيء أكثر شمولاً على ويكيبيديا أو في أي مكان آخر.

دعنا نفترض 8 بت ، لا تكافؤ ، توقف واحد (الإعداد الأكثر شيوعًا). ثم إذا كان الحرف الذي يتم إرساله هو قول 0x3F (= ASCII '؟') ، فإن الخط يبدو هكذا ؛

...--+   +---+---+---+---+---+---+       +---+--...
     | S | 1   1   1   1   1   1 | 0   0 | E
     +---+                       +---+---+

المستوى العالي (1) هو +5V عند الشريحة و -12 فولت بعد التحويل إلى مستويات RS232.

المستوى المنخفض (0) هو 0V عند الشريحة و +12 فولت بعد التحويل إلى مستويات RS232.

S هو بت البداية.

ثم لدينا 8 بت بيانات ، على الأقل أهمية أولاً ، لذلك هنا 00111111 = 0x3f = '؟'.

E هو توقف (E للنهاية) بت.

يتقدم الوقت من اليسار إلى اليمين ، تمامًا مثل شاشة الذبذبات ، إذا كان البودرات هو 4800 ، فإن كل بت تمتد (1/4800) ثانية = 0.21 مللي ثانية (تقريبًا).

يعمل جهاز الاستقبال عن طريق أخذ عينات من الخط والبحث عن حافة السقوط (خط هادئ هو ببساطة منطقي "1" طوال الوقت). يعرف المتلقي البادرات ، وعدد البتات البدء (1) ، لذلك يقيس نصف بت واحد من الحافة المتساقطة للعثور على منتصف بت ، ثم عينات الخط 8 بت على التوالي بعد ذلك لجمع بتات البيانات. ثم ينتظر جهاز الاستقبال وقتًا إضافيًا (حتى نصف الطريق خلال بت التوقف) ويبدأ في البحث عن جزء آخر من بداية (أي حافة السقوط). وفي الوقت نفسه ، يتم توفير قراءة الشخصية لبقية النظام. يضمن جهاز الإرسال أن الحافة السقوط التالية لن تبدأ حتى يكتمل بت التوقف. يمكن برمجة جهاز الإرسال للانتظار دائمًا لفترة أطول (مع توقف الإيقاف الإضافي) ، ولكن هذه مشكلة قديمة ، لم تكن هناك حاجة إلى بتات الإيقاف الإضافية فقط مع أجهزة بطيئة للغاية و/أو إعدادات برامج.

ليس لدي مواد مرجعية في متناول يدي ، ولكن سجل معدل الباود UBRR عادة ما يحتوي على قيمة المقسوم ، بدلاً من معدل باود المطلوب نفسه. أ بحث سريع Google يشير إلى أن قيمة المقسوم الصحيحة لـ 4800 Baud قد تكون 239. لذا حاول:

divisor = 239;
UBRR0H = (unsigned char)(divisor >> 8);
UBRR0L = (unsigned char)divisor;

إذا لم ينجح هذا ، تحقق من مستندات المرجعية الخاصة بشريحة معينة لصيغة حساب المقسوم الصحيحة.

لتصحيح تواصل UART ، هناك شيئان مفيدان للقيام به:

1) قم بعمل حلقة في الموصل وتأكد من أنه يمكنك قراءة ما تكتبه. إذا قمت بإرسال حرف واستعادته تمامًا ، فأنت تعلم أن الجهاز يتم توصيله بشكل صحيح ، وأن المجموعة الأساسية على الأقل من تكوين سجل UART صحيحة.

2) إرسال الحرف 0x55 مرارًا وتكرارًا - سيسمح لك نمط البت الثنائي 01010101 برؤية عرض البتات بسرعة على الذبذبات ، مما سيتيح لك التحقق من أن إعداد السرعة صحيح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top