И наоборот, педантизм - требует точности. ))
В любом случае центр масс и центр тяжести - разные вещи.
bagnis
Чтобы платформа не раскачивалась, нужно мыслить немного в других категориях. Расчет такой - равновесие - это горизонтальное положение и нулевой момент качения платформы. Двигатели создают тягу-силу, при изменении тяги надо учитывать что система должна перейти в состояние равновесия и из этого рассчитывать время работы двигателя на повышенным оборотах. Т.е. нельзя ориентироваться только на гироскоп, нужно иметь представление о физической модели и характеристик платформы.
Стоят уже 9 лет работают часы с секундомером, будильником на МК-51, микроконтроллер AT89C2051. Писал сначала на asm, но потом все усложнилось, переписал на C. Интерфейс 2 кнопки, длинное нажатие или короткое - все разные функции.
Учитывается дребезг контактов, что-бы триггеры на плату не паять. Используется динамическая индикация, ключи для индикаторов - 4 транзистора КТ315, дешифратора для цифр нету, все делаться программно. Итого на плате
кренка, диодный мост, фильтрующий конденсатор, микроконтроллер, 4 транзистора, индикаторы. Несколько резюков, помехозащищающие конденсаторы, кварц.
выложите видео чтолие, или фотку покажите - интереснож.
фотка часов.
Будут вопросы отвечу.
И вот вам ещё идея в копилку.
Недавно вот только, доделывая весы на ARM'е, с народом думали, чего ещё такого можно с ним запилить...
В итоге зачали идею самоуправляемого мяча.
Внутри смещаемый центр тяжести (там же и модуль управления и аккум), гироскопчик (кстати тут что-то про мобильные телефоны ради него говорили, но не упоминали отдельные и неплохие модули с ним), и всякое разное.
Мысль начиналась с того, чтобы мячик просчитывал и по возможности корректировал свои отскоки. Но постепенно переползли к мысли, чтобы он ещё и за тобой катился, пока ты до стадиона идёшь, например)))
На этом развитие мысли было прервано, но идея ещё теплится.
Может у вас будут какие-нибудь соображения...
Andrey
> фотка часов.
oh shi... :D
Andrey, клёвые. Какая точность? Примерно хотя бы. И что за кварц?
MoonStone
Кварц вроде 24 МГЦ. С точностью не помню. Я их подвожу на несколько секунд через какое-то время, установил это опытным путем. Не подвожу ни когда. Идут вполне точно :)
L
> oh shi... :D
а что такое?
А вот кстати сама прога. Писал почти 10 лет назад, так-что можно и попинать :)). Разработка была в Keil µVision.
#include<AT892051.H> #define TEN 10 #define Number_of_Hours 24 #define Number_of_Minuts 60 #define Number_of_Seconds 60 #define TH 0x0C3 #define TL 0x50 #define Tic 13 #define Number_of_Tics1 33 #define Number_of_Tics2 130 #define Mode_Timers 2 #define Delay 255 #define Delta_Hours 10 #define Delta_Seconds 3 sbit Zummer = P1^7; sbit HG1 = P3^0; sbit HG2 = P3^1; sbit HG3 = P3^2; sbit HG4 = P3^3; sbit SB1 = P3^5; sbit SB2 = P3^4; sbit Point = P3^7; bit Bit_Ring; //For Zummer bit Bit_Setup_Ring; //For setup ring bit Bit_Setup_Cekundomer; bit Bit_Stop_Cekundomer; typedef unsigned char byte; byte code *Segment_Code[10]={0x0C0,0x0F9,0x0A4,0x0B0,0x99,0x92,0x82,0x0F8,0x80,0x90}; byte data Register_Tics1; byte data Register_Tics2; byte data Register_Seconds; byte data Register_Minuts; byte data Register_Hours; //; Регистер часов byte data Count; byte data Register_Button1; byte data Register_Button2; byte data Memory_Minuts; byte data Memory_Hours; byte data Memory_Correct_Hours; byte data Memory_Seconds; byte data Memory_Stop_Seconds; byte data Memory_Cekundomer_Minuts; byte data Memory_Stop_Minuts; byte data Memory_Tics1; byte data Memory_Tics2; byte data x; void Timer0(void) interrupt 1 using 0 { Register_Tics1++; if ( Register_Tics1==Number_of_Tics1) { Register_Tics1=0; Register_Tics2++; if ( Register_Tics2==Number_of_Tics2-90) Point=1; if ( Register_Tics2==Number_of_Tics2) { Register_Tics2=0; Point=0; Register_Seconds++; if ( Register_Seconds==Number_of_Seconds) { Register_Seconds=0; Register_Minuts++; if ( Register_Minuts==Number_of_Minuts) { Register_Minuts=0; Register_Hours++; if ( Register_Hours==Number_of_Hours) Register_Hours=0; } } } } if ( Bit_Setup_Cekundomer){ if ( !Bit_Stop_Cekundomer){ Memory_Tics1++; if ( Memory_Tics1==Number_of_Tics1){ Memory_Tics1=0; Memory_Tics2++; if ( Memory_Tics2==Number_of_Tics2){ Memory_Tics2=0; Memory_Seconds++; if ( Memory_Seconds==Number_of_Seconds) { Memory_Seconds=0; Memory_Cekundomer_Minuts++; if ( Memory_Cekundomer_Minuts==Number_of_Minuts) Memory_Cekundomer_Minuts=0; } } } } if ( Register_Hours-Memory_Correct_Hours==Delta_Hours && Register_Seconds>=Number_of_Seconds-Delta_Seconds) Register_Seconds-=Delta_Seconds; Memory_Correct_Hours=Register_Hours; } } void Speaker( ) { x=0; Zummer=1; while( x++<=55); Zummer=0; x=0; while( x++<=55); } void Timer1( void) interrupt 3 using 0 { TH1=TH; TL1=TL; if ( !SB1) { if ( !SB2) { if ( Bit_Setup_Cekundomer) Bit_Setup_Cekundomer=0; else { Bit_Setup_Cekundomer=1; Bit_Stop_Cekundomer=1; } } if ( Bit_Setup_Cekundomer) { Memory_Seconds=0; Memory_Cekundomer_Minuts=0; Memory_Stop_Seconds=0; Memory_Cekundomer_Minuts=0; Register_Button1=0; } Register_Button1++; if ( Register_Button1==1) Speaker( ); if ( Register_Button1==Delay){ Register_Button1=0; if ( !Bit_Setup_Ring) { Register_Minuts++; if ( Register_Minuts==Number_of_Minuts) Register_Minuts=0; }else { Memory_Minuts++; if ( Memory_Minuts==Number_of_Minuts) Memory_Minuts=0; } } } if ( !SB2) { if ( !SB1){ Register_Button1=0; Register_Button2=0; if ( Bit_Setup_Ring) Bit_Setup_Ring=0; else Bit_Setup_Ring=1; } if ( Bit_Setup_Cekundomer) { Register_Button2=0; Bit_Setup_Ring=0; if ( Bit_Stop_Cekundomer) Bit_Stop_Cekundomer=0; else { Memory_Stop_Seconds=Memory_Seconds; Memory_Stop_Minuts=Memory_Cekundomer_Minuts; Bit_Stop_Cekundomer=1; } } Register_Button2++; if ( Register_Button2==1) Speaker( ); if ( Register_Button2==Delay) { Register_Button2=0; if ( !Bit_Setup_Ring) { Register_Hours++; Memory_Correct_Hours=Register_Hours; if ( Register_Hours==Number_of_Hours) Register_Hours=0; } else { Memory_Hours++; if ( Memory_Hours==Number_of_Hours) Memory_Hours=0; } } } if ( Register_Hours==Memory_Hours && Register_Minuts==Memory_Minuts) Speaker( ); if ( Register_Minuts==Number_of_Minuts-1 && Register_Seconds==Number_of_Seconds-1 && Register_Tics2==Number_of_Tics2-1) if ( Bit_Ring) { Bit_Ring=0; Speaker( ); } else Bit_Ring=1; Count++; switch ( Count) { case 1:{ HG4=1; HG1=0; if ( Bit_Setup_Cekundomer) { Bit_Setup_Ring=0; if ( !Bit_Stop_Cekundomer) x=Memory_Minuts/TEN; else x=Memory_Stop_Minuts/TEN; } else x=Register_Hours/TEN; if ( Bit_Setup_Ring) x=Memory_Hours/TEN; P1=*( Segment_Code+x); } break; case 2:{ HG1=1; HG2=0; if ( Bit_Setup_Cekundomer) { if ( !Bit_Stop_Cekundomer) x=Memory_Cekundomer_Minuts%TEN; else x=Memory_Stop_Minuts%TEN; Point=1; } else x=Register_Hours%TEN; if ( Bit_Setup_Ring){ x=Memory_Hours%TEN; Point=0; } P1=*( Segment_Code+x); } break; case 3:{ HG2=1; HG3=0; if ( Bit_Setup_Cekundomer) { if ( !Bit_Stop_Cekundomer) x=Memory_Seconds/TEN; else x=Memory_Stop_Seconds/TEN; } else x=Register_Minuts/TEN; if ( Bit_Setup_Ring) x=Memory_Minuts/TEN; P1=*( Segment_Code+x); } break; case 4:{ HG3=1; HG4=0; if ( Bit_Setup_Cekundomer) { if ( !Bit_Stop_Cekundomer) x=Memory_Seconds%TEN; else x=Memory_Stop_Seconds%TEN; } else x=Register_Minuts%TEN; if ( Bit_Setup_Ring) x=Memory_Minuts%TEN; P1=*( Segment_Code+x); Count=0; } break; } } void main( void) { TH1=TH; TL1=TL; TH0=Tic; P1=*Segment_Code; P3=0x0F0; IP=2; IE=0x8A; TMOD=Mode_Timers; Register_Tics1=Register_Tics2=Register_Seconds=Register_Minuts=Register_Hours=0; while ( SB1); TR1=1; TR0=1; while ( 1); }
Andrey
даёшь статью!
О, Keil.. В нём же и весы клепали. Но сейчас товарищ переползает на Eclipse - говорит повеселее с ним. Хотя первое, чем удивил - споткнулся о файл с названием "0x0" :)
И чтобы уж без неопределённостей...
> "Я их подвожу на несколько секунд через какое-то время..." и "Не подвожу ни когда."
Какое предложение вернее? :)
Тёплый ламповый Keil.
У них ещё RTOS-ина прикольная
MoonStone
> > "Я их подвожу на несколько секунд через какое-то время..." и "Не подвожу ни
> > когда."
> Какое предложение вернее? :)
Ага, действительно не совсем точно написал. Короче
Часы вручную т.е. кнопками никода не подвожу, достигается это автоматической подводкой часов программно, в коде подвожу на несколько секунд через какое-то время. А вот и кусок кода:
#define Delta_Hours 10 #define Delta_Seconds 3 .... if (Register_Hours-Memory_Correct_Hours==Delta_Hours && Register_Seconds>=Number_of_Seconds-Delta_Seconds) Register_Seconds-=Delta_Seconds; Memory_Correct_Hours=Register_Hours; }
SashkuS
> даёшь статью!
Да ну! Устарело это все уже. Да и о чем писать все это есть в интернете. Я отошел уже от электроники хотя иногда бывает ностальгия...
Нихера не умею, но всё-равно вступлю... Просто хочу, что-бы кто-нить, поделился опытом ARM... )))
З.Ы. обкатываю примитивный проц потипу древнего z80(на большее меня не хватило), но со стековой памятью (quadtree-stack), херню какую-то изобрёл, нет-бы стек и регистры как у всех нормальных людей... хотя вместе с байт-код интерпретатором будет работать гораздо быстрее, чем если бы память была регистровая =)
Тема в архиве.