Автор Тема: странен тайминг  (Прочетена 2295 пъти)

0 Потребители и 1 Гост преглежда(т) тази тема.

jazzman

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 25
  • -Получени: 190
  • Публикации: 3624
странен тайминг
« -: 30 Октомври 2016, 03:42:51 »
Таз джаджа пристигна онзи ден. Вързах я към един atmega328, ъплоаднах към кода него и системата заработи обаче ..... delay-я нещо се ебава :) Примерно за да задам delay от 1 сек, трябва да напиша 50 вместо 1000.

Код: C
  1.  
  2. #include <avr/io.h>о
  3. #include <util/delay.h>
  4.  
  5. #define BLINK_DELAY_MS 50
  6.  
  7.  

Ако ъплоадна кода директно към Ардуино борда ( моят има ISP конектор ) всичко е нормално както преди :)

Java is to Javascript as fun is to funeral.

http://nau4i.me/forum/index.php/topic,15129.0.html

kjufte

  • Sr. Member
  • ****
  • Благодарности
  • -Казани: 1
  • -Получени: 51
  • Публикации: 308
Re: странен тайминг
« Отговор #1 -: 30 Октомври 2016, 11:04:28 »
Ами функцията delay се осланя на системният такт.
Ти като компилираш сетваш един глобален define, с който казваш, че clock-a с който захранваш системата е 16MHz (ако не си го сетнал default-a е 1MHz).
Това обаче е нещо, което ти просто обещаваш на компилатора и той ти вярва. А истинската стойност, която е нагласена хардуерно в микроконтролера се настройва с fuses.
Ако погледнеш в секцията Fuse Bits на ATmega328/P datasheet ще видиш
1) CKSEL бит-овете са настроени по default за 8MHz
2) CKDIV8 ти е сетнат пак по default. Това значи, че клок-а ти се дели на 8, което ти дава ефективен такт от 1MHz

Другото голямо проблем, е че тези функции са мислени само за кратки чакалъци (примерно switch debouncing)
В документацията на хедъра delay.h четем, че максималната стойност на чакалнята е
Цитат
The maximal possible delay is 262.14 ms / F_CPU in MHz.
Което значи при такт от:
1MHz   -> 262.14 ms
8MHz   -> 32.8 ms
16MHz -> 16.4 ms

При по-големи зададени стойности от максималните, функциите започват да разтягат локуми и не са точни.


Ето ти един fuse-калкулатор скойто можеш да си пресметнеш стойностите за 3-те байта.
Много внимавай кои bits ще сетнеш, защото може да си направиш микроконтролера неизползваем.
Бих те посъветвал RSTDISBL, SPIEN и DWEN да не ги бараш. Т.е. не да не ги сетваш, а да ги остваиш така както са си!

Командата за четене на актуалните стойности с avrdude ще ти изглежда нещо такова
Код: Text
  1. avrdude -c avrisp2 -P /dev/ttyUSB0 -p m328p -n -v

Порта естествено трябва да си го нагласиш. Също така и не разбрах atmega328 или atmega328p имаш. Съответно махаш от командата 'p'-то ако трябва.


« Последна редакция: 30 Октомври 2016, 11:44:13 от kjufte »

jazzman

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 25
  • -Получени: 190
  • Публикации: 3624
Re: странен тайминг
« Отговор #2 -: 30 Октомври 2016, 13:03:47 »
Промених честотата от 16 на 1 MHZ и ми се струва нормално вече.

Цитат
avr-gcc -Os -DF_CPU=1000000UL -mmcu=atmega328 -c -o blink.o blink.c


Цитат
Бих те посъветвал RSTDISBL, SPIEN и DWEN да не ги бараш. Т.е. не да не ги сетваш, а да ги остваиш така както са си!

Знам това.

Цитат
Също така и не разбрах atmega328 или atmega328p имаш. Съответно махаш от командата 'p'-то ако трябва


Имам и от двете.


 
Java is to Javascript as fun is to funeral.

http://nau4i.me/forum/index.php/topic,15129.0.html

jazzman

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 25
  • -Получени: 190
  • Публикации: 3624
Re: странен тайминг
« Отговор #3 -: 01 Ноември 2016, 14:02:11 »
Цитат
Порта естествено трябва да си го нагласиш.


Що не мога да намеря пущината ;)

Ето командата с коята ъплоадвам дейтата към чипа: 

Код: C
  1. avrdude -c avrisp2 -P usb -p atmega328p -U flash:w:blink.hex
  2.  


Обаче ако искам да видя изход примерно с "cat /dev/usb // пробвах всичко възможно от /dev директорията ", с ардуино беше лесно - "cat  /dev/ttyACM0" 
Java is to Javascript as fun is to funeral.

http://nau4i.me/forum/index.php/topic,15129.0.html

kjufte

  • Sr. Member
  • ****
  • Благодарности
  • -Казани: 1
  • -Получени: 51
  • Публикации: 308
Re: странен тайминг
« Отговор #4 -: 01 Ноември 2016, 15:02:01 »
Щото ти трябва примерно един USB TTL converter, който да ти даде някъв порт. Или ако компа ти е от по-старите и има RS232 вход може направо с него да се свържеш директно като си моднеш някое старо кабелче.
« Последна редакция: 01 Ноември 2016, 15:06:01 от kjufte »

jazzman

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 25
  • -Получени: 190
  • Публикации: 3624
Re: странен тайминг
« Отговор #5 -: 01 Ноември 2016, 17:35:13 »
Ако взема таз джаджа то тогава не се ли обезмисля ползването на  AVRISP-то? 
Java is to Javascript as fun is to funeral.

http://nau4i.me/forum/index.php/topic,15129.0.html

kjufte

  • Sr. Member
  • ****
  • Благодарности
  • -Казани: 1
  • -Получени: 51
  • Публикации: 308
Re: странен тайминг
« Отговор #6 -: 01 Ноември 2016, 18:43:17 »
Едното няма нищо общо с другото. Програматора използва SPI, а ти искаш да осъществиш комуникация през UART.
С тоз USB to TTL обръщач не можеш да програмираш микроконтролера.

Ардуинотата също имат такъв преобразуващ чип (FTDI най-често) и за това виждаш порт за комуникация.
« Последна редакция: 01 Ноември 2016, 19:23:21 от kjufte »

jazzman

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 25
  • -Получени: 190
  • Публикации: 3624
Re: странен тайминг
« Отговор #7 -: 01 Ноември 2016, 19:48:54 »
Ясно.... :) Добре, но ако искам да направя някакъв дебъгинг по кода, да речем искам да разбера каква стойност връща photo cell sensor-a, прилично IDE ли ще ми трябва? 
Java is to Javascript as fun is to funeral.

http://nau4i.me/forum/index.php/topic,15129.0.html

kjufte

  • Sr. Member
  • ****
  • Благодарности
  • -Казани: 1
  • -Получени: 51
  • Публикации: 308
Re: странен тайминг
« Отговор #8 -: 01 Ноември 2016, 20:10:14 »
Приличното IDE ще ти трябва така или иначе. За дебъгинг ти бях писал в постинга, където ти писах и за AVRISP mkII.
Има (минимум) два варианта за дебъгване.
1. добрият стар printf, което значи че ще ти трябва връзка през UART
2. дебъгинг хардуер, с който слагаш break points и да четеш директно регистри и памет (променливи) на микроконтролера
3. аз ползвам винаги комбинация от 1 и 2, но не на avr-ки, а на STM. Атмелските чипове съм ги дебъгвал само на принт.

jazzman

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 25
  • -Получени: 190
  • Публикации: 3624
Re: странен тайминг
« Отговор #9 -: 01 Ноември 2016, 22:29:20 »
Оки, доки. Разбраф та ва  ;D

Аз си мислех, че ще мога да ползвам АVRISP-то през USB порта, но явно съм грешал. Ще те ъпдейтвам редовно като се сблъскам с нещо непознато и ново за мен :0
Java is to Javascript as fun is to funeral.

http://nau4i.me/forum/index.php/topic,15129.0.html

kjufte

  • Sr. Member
  • ****
  • Благодарности
  • -Казани: 1
  • -Получени: 51
  • Публикации: 308
Re: странен тайминг
« Отговор #10 -: 02 Ноември 2016, 07:59:16 »
Ами нормална обърквация. Трябва да гледаш на всеки компонент като отделна система. Компа ти разговаря само с ivrisp-то през USB. Компа няма директна връзка с микроконтролера. За това и нямаш порт. От своя страна ivrisp-то разговаря с микроконтролера, но само през SPI-интерфейса. Така си ги и навързал двата компонента, свързвайки MISO, MOSI и SCK.
Ако ползваш UART ще трябва вместо това да свържеш RXD и TXD пиновете на микроконтролера със съответните пинове на хардуера с който ще има комуникация (примерно USB TTL).

Давай повече и по-често инфо за проекта. Ако може даже със снимков мат'рял и/или схеми. Барем запалиш повече хора по embedded programming.  :)
 

jazzman

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 25
  • -Получени: 190
  • Публикации: 3624
Re: странен тайминг
« Отговор #11 -: 02 Ноември 2016, 13:10:10 »
Поръчах го. Ако знаех, миналият месец ходих до Бостън и посетих Micro Center. Там го видях, се чудих за кво ли може да ми потрябва :)
Java is to Javascript as fun is to funeral.

http://nau4i.me/forum/index.php/topic,15129.0.html